일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- database
- 단축키
- jupyter
- 클론
- MySQL
- cmd
- Python
- console창
- 깃 토큰
- DataGrip
- php
- visualstudio code
- PHPStorm
- github clone
- OrCAD 다운로드
- 데이터베이스
- error
- 에러
- run sql script
- 파이썬
- github token
- Visual Studio Code
- localhost
- error 해결
- vscode
- 따옴표 삭제
- csv
- clone
- import data
- 오류
- Today
- Total
개발 노트
10/19 Bean, AOP 개념 본문
[env03]
AdminConnection(class, InitalzingBean, DisposableBean 상속)
package env03;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
public class AdminConnection implements InitializingBean, DisposableBean {
private String adminId;
private String adminPw;
private String sub_adminId;
private String sub_adminPw;
public void destroy() throws Exception {
System.out.println("AdminConnection destory() 소멸자 소멸 전...");
}
public void afterPropertiesSet() throws Exception {
System.out.println("AdminConnection afterPropertiesSet() 생성자 생성 이후...");
}
public String getAdminId() {
return adminId;
}
public void setAdminId(String adminId) {
this.adminId = adminId;
}
public String getAdminPw() {
return adminPw;
}
public void setAdminPw(String adminPw) {
this.adminPw = adminPw;
}
public String getSub_adminId() {
return sub_adminId;
}
public void setSub_adminId(String sub_adminId) {
this.sub_adminId = sub_adminId;
}
public String getSub_adminPw() {
return sub_adminPw;
}
public void setSub_adminPw(String sub_adminPw) {
this.sub_adminPw = sub_adminPw;
}
}
ApplicationConfig (class) : env02에서 했던 xml 파일과 같은 역할을 한다.
외부에 있는 키, value 값을 편하게 내부로 가져오는 코드이다.
package env03;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
/*@Configuration : 환경설정*/
@Configuration
public class ApplicationConfig {
@Value("${admin.id}")
private String adminId;
@Value("${admin.pw}")
private String adminPw;
@Value("${sub_admin.id}")
private String sub_adminId;
@Value("${sub_admin.pw}")
private String sub_adminPw;
/* Bean은 객체임 */
@Bean
/* Properties작업(환경작업)이 있다면 생성자처럼 내부에서 자동으로 호출된다. Properties를 리턴하는 객체가 있는지 찾는다. */
public static PropertySourcesPlaceholderConfigurer Properties() {
PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
System.out.println("2. Properties Run..");
Resource[] locations = new Resource[2];
locations[0] = new ClassPathResource("admin3.properties");
locations[1] = new ClassPathResource("sub_admin3.properties");
configurer.setLocations(locations);
return configurer;
}
@Bean
public AdminConnection adminConfig() {
AdminConnection adminConnection = new AdminConnection();
System.out.println("3. adminConfig Run");
adminConnection.setAdminId(adminId);
adminConnection.setAdminPw(adminPw);
adminConnection.setSub_adminId(sub_adminId);
adminConnection.setSub_adminPw(sub_adminPw);
return adminConnection;
}
}
EnvMainClass03 (class, main)
package env03;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class EnvMainClass03 {
public static void main(String[] args) {
System.out.println("1 EnvMainClass03 Run...");
AnnotationConfigApplicationContext ctx =
new AnnotationConfigApplicationContext(ApplicationConfig.class);
System.out.println("4 EnvMainClass03 adminConfig Before Run");
AdminConnection connection = ctx.getBean("adminConfig", AdminConnection.class);
System.out.println("5 EnvMainClass03 adminConfig After Run");
System.out.println("connection.getAdminId adminID : " + connection.getAdminId());
System.out.println("connection.getAdminPw adminPW : " + connection.getAdminPw());
System.out.println("connection.getSub_adminId() sub_adminID : " + connection.getSub_adminId());
System.out.println("connection.getSub_adminPw() sub_adminPW : " + connection.getSub_adminPw());
ctx.close();
}
}
src/main/resources > admin3.properties (file)
admin.id=super
admin.pw=12345
src/main/resources > sub_admin3.properties (file)
sub_admin.id=sub3
sub_admin.pw=67890
출력 결과
[env04] : 개발환경 기능과 실행환경 기능을 따로 만들어놓고 사용자가 선택하게 하여 실행되게 함.
ServerInfo(class)
package env04;
public class ServerInfo {
private String ipNum;
private String portNum;
public String getIpNum() {
return ipNum;
}
public void setIpNum(String ipNum) {
this.ipNum = ipNum;
}
public String getPortNum() {
return portNum;
}
public void setPortNum(String portNum) {
this.portNum = portNum;
}
}
EnvMainClass04 (class)
package env04;
import java.util.Scanner;
import org.springframework.context.support.GenericXmlApplicationContext;
public class EnvMainClass04 {
public static void main(String[] args) {
String config = null;
System.out.println("System을 입력하세요? dev OR run");
Scanner scanner = new Scanner(System.in);
String str = scanner.next();
if(str.equals("dev")) {
config = "dev";
} else if(str.equals("run")) {
config = "run";
}
scanner.close();
GenericXmlApplicationContext ctx = new GenericXmlApplicationContext();
//활성화시킨다.
ctx.getEnvironment().setActiveProfiles(config);
ctx.load("applicationCTX_dev.xml", "applicationCTX_run.xml");
ctx.refresh();
ServerInfo info = ctx.getBean("serverInfo", ServerInfo.class);
System.out.println("ip : " + info.getIpNum());
System.out.println("port : " + info.getPortNum());
ctx.close();
}
}
src/main/resources > applicationCTX_dev.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"
profile="dev">
<bean id="serverInfo" class="env04.ServerInfo">
<property name="ipNum" value="localhost"></property>
<property name="portNum" value="8181"></property>
</bean>
</beans>
src/main/resources > applicationCTX_run.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"
profile="run">
<bean id="serverInfo" class="env04.ServerInfo">
<property name="ipNum" value="172.30.1.93"></property>
<property name="portNum" value="8080"></property>
</bean>
</beans>
출력 결과 (dev 입력)
출력 결과 (run 입력)
[AOP 개념]
(중요)
<och06_AOP1>
pom.xml : 구글링해서 라이브러리 세팅
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.springframework.samples</groupId>
<artifactId>com.oracle.aop1</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<!-- Generic properties -->
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<!-- Spring -->
<spring-framework.version>3.2.3.RELEASE</spring-framework.version>
<!-- Hibernate / JPA -->
<hibernate.version>4.2.1.Final</hibernate.version>
<!-- Logging -->
<logback.version>1.0.13</logback.version>
<slf4j.version>1.7.5</slf4j.version>
<!-- Test -->
<junit.version>4.11</junit.version>
</properties>
<dependencies>
<!-- Spring and Transactions -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring-framework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring-framework.version}</version>
</dependency>
<!-- Logging with SLF4J & LogBack -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback.version}</version>
<scope>runtime</scope>
</dependency>
<!-- Hibernate -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>${hibernate.version}</version>
</dependency>
<!-- Test Artifacts -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring-framework.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<!-- AOP -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.2</version>
</dependency>
</dependencies>
</project>
[aop1]
Student (class)
package aop1;
public class Student {
private String name;
private int age;
private int gradeNum;
private int classNum;
public void getStudentInfo() {
System.out.println("name "+ getName());
System.out.println("age "+getAge());
System.out.println("gradeNum "+ getGradeNum());
System.out.println("classNum "+ getClassNum());
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getGradeNum() {
return gradeNum;
}
public void setGradeNum(int gradeNum) {
this.gradeNum = gradeNum;
}
public int getClassNum() {
return classNum;
}
public void setClassNum(int classNum) {
this.classNum = classNum;
}
}
Worker (class)
package aop1;
public class Worker {
private String name;
private int age;
private String job;
public void getWorkerInfo() {
System.out.println("이름 : " + getName());
System.out.println("나이 : " + getAge());
System.out.println("직업 : " + getJob());
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
}
LogAop (class)
package aop1;
import org.aspectj.lang.ProceedingJoinPoint;
public class LogAop {
//Around Advice에서 사용할 공통기능 메서드는,
//대부분 파라미터로 전달받은 ProceedingJoinPoint의 proceed() 메서드만 호출.
public Object loggerAop(ProceedingJoinPoint joinpoint) throws Throwable{
//핵심 관심사의 Method를 가져올 때 하단 코드 사용
String signatureStr = joinpoint.getSignature().toShortString();
System.out.println(signatureStr + "is start...");
long startTime = System.currentTimeMillis();
Object obj;
try {
//joinpoint : 핵심관심사의 Method. 그것을 수행(proceed)한다.
obj = joinpoint.proceed();
return obj;
} finally {
long endTime = System.currentTimeMillis();
System.out.println(signatureStr + "is finished.");
System.out.println(signatureStr + "경과시간 : " + (endTime - startTime));
}
}
}
AopMainClass01 (class)
package aop1;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
public class AopMainClass01 {
public static void main(String[] args) {
AbstractApplicationContext ctx = new GenericXmlApplicationContext("classpath:applicationCTX01.xml");
Student student = ctx.getBean("student", Student.class);
student.getStudentInfo();
Worker worker = ctx.getBean("worker", Worker.class);
worker.getWorkerInfo();
ctx.close();
}
}
resource > applicationCTX01.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd">
<bean id="logAop" class="aop1.LogAop"></bean>
<!-- aop:config는 AOP의 전체 설정 감싸는 태그 -->
<aop:config>
<!-- aop:aspect는 핵심 관심 포인트컷과 횡단 관심 어드바이스를 결합하는 것. -->
<aop:aspect id="logger1" ref="logAop">
<!-- aop:pointcut은 포인트컷을 지정하여 선택된 메소드. -->
<!-- aop 안에 있는 모든 것이 실행되면 띄운다. -->
<aop:pointcut expression="within(aop1.*)" id="pointcut1"/>
<!-- aop1.S~ 인 것이 실행된다. 즉 aop1.Student만 실행되고 aop1.Worker는 실행되지 않는다. -->
<!-- 이 기능을 통해 코드의 흐름을 제어하거나 성능 측정을 할 수 있다. -->
<!-- <aop:pointcut expression="within(aop1.S*)" id="pointcut1"/> -->
<aop:around method="loggerAop" pointcut-ref="pointcut1"/>
</aop:aspect>
</aop:config>
<bean id="student" class="aop1.Student" >
<property name="name" value="연개소문" />
<property name="age" value="50" />
<property name="gradeNum" value="3" />
<property name="classNum" value="5" />
</bean>
<bean id="worker" class="aop1.Worker" >
<property name="name" value="이순신" />
<property name="age" value="35" />
<property name="job" value="개발자" />
</bean>
</beans>
출력 결과
<och06_AOP2>
java > aop2.buz (package, 핵심관심사 이 패키지에 몰아 작성)
aop2.buz > Student (class)
package aop2.buz;
public class Student {
private String name;
private int age;
private int gradeNum;
private int classNum;
public Student() {
System.out.println("Student 생성자");
}
public void getStudentInfo() {
System.out.println("이름 : " + getName());
System.out.println("나이 : " + getAge());
System.out.println("학년 : " + getGradeNum());
System.out.println("반 : " + getClassNum());
// 오류를 일부러 발생시켜 실행되는지 확인하는 것. 오류가 발생하면 afterThrowingAdvice() 실행됨.
//System.out.println(10/0);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getGradeNum() {
return gradeNum;
}
public void setGradeNum(int gradeNum) {
this.gradeNum = gradeNum;
}
public int getClassNum() {
return classNum;
}
public void setClassNum(int classNum) {
this.classNum = classNum;
}
}
aop2.buz > Worker (class)
package aop2.buz;
public class Worker {
private String name;
private int age;
private String job;
public void getWorkerInfo() {
System.out.println("이름 : " + getName());
System.out.println("나이 : " + getAge());
System.out.println("직업 : " + getJob());
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
}
aop2 > LogAop (class)
package aop2;
import org.aspectj.lang.ProceedingJoinPoint;
public class LogAop {
//시간 측정 코드
public Object loggerAop(ProceedingJoinPoint joinpoint) throws Throwable {
// 핵심업무에 사용 method
String signatureStr = joinpoint.getSignature().toString();
long st = System.currentTimeMillis();
System.out.println( signatureStr + " is start...");
try {
//핵심업무 ( aop2.buz.Student.getStudentInfo()) 실행
Object obj = joinpoint.proceed();
return obj;
} finally {
long et = System.currentTimeMillis();
System.out.println( signatureStr + " is finished.");
System.out.println( signatureStr + " 경과시간 : " + (et - st));
}
}
public void beforeAdvice() {
System.out.println("beforeAdvice()");
}
public void afterReturningAdvice() {
System.out.println("afterReturningAdvice()");
}
public void afterThrowingAdvice() {
System.out.println("afterThrowingAdvice()");
}
public void afterAdvice() {
System.out.println("afterAdvice()");
}
}
aop2 > AopMainClass02 (class, main)
package aop2;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
import aop2.buz.Student;
import aop2.buz.Worker;
public class AopMainClass02 {
public static void main(String[] args) {
AbstractApplicationContext ctx =
new GenericXmlApplicationContext("classpath:applicationCTX02.xml");
Student student = ctx.getBean("student", Student.class);
student.getStudentInfo();
Worker worker = ctx.getBean("worker", Worker.class);
worker.getWorkerInfo();
ctx.close();
}
}
resource > applicationCTX02.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd">
<bean id="logAop" class="aop2.LogAop"></bean>
<aop:config>
<aop:aspect id="logger" ref="logAop">
<aop:pointcut expression="within(aop2.buz.*)" id="pointcut1"/>
<!-- pointcut1이 실행이 되면, 즉 within(aop2.buz.*)가 실행이 되면 LoaAop.java의 loggerAop 이벤트를 실행시킨다. -->
<aop:around method="loggerAop" pointcut-ref="pointcut1"/>
</aop:aspect>
<aop:aspect id="logger" ref="logAop">
<aop:pointcut expression="within(aop2.buz.*)" id="pointcut2"/>
<aop:before method="beforeAdvice" pointcut-ref="pointcut2"/>
</aop:aspect>
<aop:aspect id="logger" ref="logAop">
<aop:pointcut expression="within(aop2.buz.*)" id="pointcut3"/>
<aop:after-throwing method="afterThrowingAdvice" pointcut-ref="pointcut3"/>
</aop:aspect>
<aop:aspect id="logger" ref="logAop">
<aop:pointcut expression="within(aop2.buz.*)" id="pointcut4"/>
<aop:after method="afterAdvice" pointcut-ref="pointcut4"/>
</aop:aspect>
</aop:config>
<bean id="student" class="aop2.buz.Student" >
<property name="name" value="김춘추" />
<property name="age" value="10" />
<property name="gradeNum" value="3" />
<property name="classNum" value="5" />
</bean>
<bean id="worker" class="aop2.buz.Worker" >
<property name="name" value="김유신" />
<property name="age" value="35" />
<property name="job" value="개발자" />
</bean>
</beans>
출력 결과 (오류 안난 경우)
출력 결과 (오류 난 경우)
<och06_AOP3>
java > aop3.buz(package) > Student(class)
package aop3.buz;
public class Student {
private String name;
private int age;
private int gradeNum;
private int classNum;
public void getStudentInfo() {
System.out.println("이름 : " + getName());
System.out.println("나이 : " + getAge());
System.out.println("학년 : " + getGradeNum());
System.out.println("반 : " + getClassNum());
}
public void get3StudentInfo() {
System.out.println("이름3 : " + getName());
System.out.println("나이3 : " + getAge());
System.out.println("학년3 : " + getGradeNum());
System.out.println("반 3: " + getClassNum());
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getGradeNum() {
return gradeNum;
}
public void setGradeNum(int gradeNum) {
this.gradeNum = gradeNum;
}
public int getClassNum() {
return classNum;
}
public void setClassNum(int classNum) {
this.classNum = classNum;
}
}
java > aop3.buz(package) > Worker(class)
package aop3.buz;
public class Worker {
private String name;
private int age;
private String job;
public void getWorkerInfo() {
System.out.println("이름 : " + getName());
System.out.println("나이 : " + getAge());
System.out.println("직업 : " + getJob());
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
}
java > aop3(package) > LogAop(class)
package aop3;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
@Aspect
public class LogAop {
// aop3.buz 패키지 안에 있는 모든 메소드를 Pointcut한다.
@Pointcut("within(aop3.buz.*)")
//Pointcut 메소드 생성
private void pointcutMethod() {
}
/*
*/
@Around("pointcutMethod()")
public Object loggerAop(ProceedingJoinPoint joinpoint) throws Throwable {
String signatureStr = joinpoint.getSignature().toShortString();
System.out.println( signatureStr + " is start.");
long st = System.currentTimeMillis();
try {
Object obj = joinpoint.proceed();
return obj;
} finally {
long et = System.currentTimeMillis();
System.out.println( signatureStr + " is finished.");
System.out.println( signatureStr + " 경과시간 : " + (et - st));
}
}
@Before("within(aop3.buz.*)")
public void beforeAdvice() {
System.out.println("beforeAdvice()");
}
@After("within(aop3.buz.*)")
public void afterAdvice() {
System.out.println("AfterAdvice()");
}
}
java > aop3(package) > AopMainClass03(class)
package aop3;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
import aop3.buz.Student;
public class AopMainClass03 {
public static void main(String[] args) {
AbstractApplicationContext ctx =
new GenericXmlApplicationContext("classpath:applicationCTX03.xml");
Student student = ctx.getBean("student", Student.class);
student.getStudentInfo();
student.getStudentInfo();
student.get3StudentInfo();
ctx.close();
}
}
resources > applicationCTX03.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd">
<aop:aspectj-autoproxy/>
<bean id="logAop" class="aop3.LogAop"></bean>
<bean id="student" class="aop3.buz.Student" >
<property name="name" value="홍길동" />
<property name="age" value="10" />
<property name="gradeNum" value="3" />
<property name="classNum" value="5" />
</bean>
</beans>
출력 결과