[Spring] AOP 사용하기
- Web/Spring
- 2020. 10. 22.
실행 결과 모습
메소드를 호출하면서 그 전, 후에 갚이 추가되는 것을 확인 할 수가 있다.
<!-- aop 기능 -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.7.4</version>
</dependency>
Porm.xml에 먼저 이것 부터 추가하고 시작한다.
Proxy 라이브러리가 필요하므로 먼저 xml을 사용한다.
이러면 자동완성 기능도 활성화 되기 때문에 여러므로 좋다.
패키지에 필요한 Bean은 다음과 같다
Student.java
package com.day03.Ex05;
public class Student {
private String name;
private int age;
private int gradeNum;
private int classNum;
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;
}
public void getStudentInfo()
{
System.out.println("이름 : "+getName());
System.out.println("나이 : "+getAge());
System.out.println("학년 : "+getGradeNum());
System.out.println("반 : "+getClassNum());
}
}
Worker.java
package com.day03.Ex05;
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.java
package com.day03.Ex05;
import org.aspectj.lang.ProceedingJoinPoint;
//공통기능
public class LogAop {
//proxy
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));
}
}
}
지금 이 과정에서는 logAop.class를 통해서 AOP를 작동하는 것을 확인 할 것이다.
그러기 위해서는 당연히 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.1.xsd">
<bean id="logAop" class="com.day03.Ex05.LogAop" />
<!-- AOP의존설정 -->
<aop:config>
<aop:aspect id="logger" ref="logAop">
<aop:pointcut id="publicM"
expression="within(com.day03.Ex05.*)" />
<aop:around pointcut-ref="publicM" method="loggerAop" />
</aop:aspect>
</aop:config>
<bean id="student" class="com.day03.Ex05.Student">
<property name="name" value="홍길동" />
<property name="age" value="15" />
<property name="gradeNum" value="3" />
<property name="classNum" value="15" />
</bean>
<bean id="worker" class="com.day03.Ex05.Worker">
<property name="name" value="홍길동" />
<property name="age" value="15" />
<property name="job" value="도둑" />
</bean>
</beans>
xml에서 알다싶이 좀 많이 복잡하다.
먼저 객체 등록을 하기 위해 bean을 먼저 사용하고
그 아래에는 config를 사용한다.
aspect는 해당 class를 참조한다는 의미이다.
pointcut은 적용 범위를 정하며, 패키지를 통해 전체 지정 또한 할 수 있다.
around는 aspect를 통해 참조 한 class 내의 method를 호출함으로써
pointcut 범위 내에 있던 객체가 호출 될 때마다 전, 후 과정에 해당 작업이 실행된다.
aop란 결국 JAVA가 원래 실행하는 도중에 과정을 포함을 시켜서
실행 외의 작업이 실행되도록 하는 부가적인 설정이자 또는 다른 코드에 손 대는 것 없이 기능을 추가 할 수 있는 매우 특이하면서도 필요한 작업 과정이기도 하다.
이 외에도 아래의 코드를 보면 좀 더 많은 추가를 할 수 있다는 것을 확인 할 수 있다.
LogAop.java
package com.day03.Ex06;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
//공통기능
public class LogAop {
//proxy
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));
}
}
public void beforeAdvice(JoinPoint joinPoint)
{
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()");
}
}
AdminDay03Ex06.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.1.xsd">
<bean id="logAop" class="com.day03.Ex06.LogAop" />
<!-- AOP의존설정 -->
<aop:config>
<aop:aspect id="logger" ref="logAop">
<aop:pointcut id="publicM"
expression="within(com.day03.Ex06.*)" />
<aop:around pointcut-ref="publicM" method="loggerAop" />
</aop:aspect>
</aop:config>
<aop:config>
<aop:aspect id="logger" ref="logAop">
<aop:pointcut id="publicM"
expression="within(com.day03.Ex06.*)" />
<aop:before pointcut-ref="publicM" method="beforeAdvice" />
</aop:aspect>
</aop:config>
<aop:config>
<aop:aspect id="logger" ref="logAop">
<aop:pointcut id="publicM"
expression="within(com.day03.Ex06.*)" />
<aop:after-returning pointcut-ref="publicM"
method="afterReturningAdvice" />
</aop:aspect>
</aop:config>
<aop:config>
<aop:aspect id="logger" ref="logAop">
<aop:pointcut id="publicM"
expression="within(com.day03.Ex06.*)" />
<aop:after-throwing pointcut-ref="publicM"
method="afterThrowingAdvice" />
</aop:aspect>
</aop:config>
<aop:config>
<aop:aspect id="logger" ref="logAop">
<aop:pointcut id="publicM"
expression="within(com.day03.Ex06.*)" />
<aop:after pointcut-ref="publicM" method="afterAdvice" />
</aop:aspect>
</aop:config>
<bean id="student" class="com.day03.Ex06.Student">
<property name="name" value="홍길동" />
<property name="age" value="15" />
<property name="gradeNum" value="3" />
<property name="classNum" value="15" />
</bean>
<bean id="worker" class="com.day03.Ex06.Worker">
<property name="name" value="홍길동" />
<property name="age" value="15" />
<property name="job" value="도둑" />
</bean>
</beans>
MainClass.java
package com.day03.Ex06;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
public class MainClass {
public static void main(String[] args) {
// AOP 에 대해 알아보자
AbstractApplicationContext ctx = new GenericXmlApplicationContext("classpath:AdminDay03Ex06.xml");
Student student = ctx.getBean("student", Student.class);
student.getStudentInfo();
Worker worker = ctx.getBean("worker", Worker.class);
worker.getWorkerInfo();
ctx.close();
}
}
'Web > Spring' 카테고리의 다른 글
[Spring] AOP 사용하기(Java) (0) | 2020.10.22 |
---|---|
[Spring] 선택해서 해당 xml 실행하게 만들기 (0) | 2020.10.22 |
[Spring] AOP에 대해 알아보자 (0) | 2020.10.22 |
[Spring] xml 가져오기2(줄임 방식) (0) | 2020.10.22 |
[Spring] 외부의 xml 자료를 가져오기 (0) | 2020.10.22 |