aspectJ기술은 AOP를 보다 쉽고 강력하게 적용하기 위한 기술입니다. aspectJ는 다음과 같은 특징을 가지고 있습니다.
- compile된 bytecode에 대한 re-compile을 통한 새로운 bytecode의 작성으로 인한 AOP가 갖는 성능 저하의 최소
- pointcut, advisor의 직접적인 선언을 이용한 보기 쉬운 코드의 작성
먼저, AspectJ를 실행하기 위해서는 다음 3개의 maven repository의 등록이 필요합니다.
compile 'org.aspectj:aspectjrt:1.7.4'
compile 'org.aspectj:aspectjtools:1.7.4'
compile 'org.aspectj:aspectjweaver:1.7.4'
aspectJ는 중요한 3개의 단어 정의가 먼저 필요합니다.
- Pointcut : AOP가 적용되는 시점을 정의합니다. 정의 방법은 @annotation, expression, method, beanName 등의 방법이 있습니다.
- Advice : Pointcut과 연동되어 AOP가 적용될 method를 의미합니다. 전/후 처리 method를 의미합니다.
- Advisor : Point + Advice를 정의된 class를 의미합니다. Spring에서 aspectJ에 대한 지원을 하기 위한 방법으로 사용됩니다.
예시로 가장 간단히 사용할 수 있는 @annotation을 이용한 AOP에 대한 예제에 대해서 알아보도록 하겠습니다.
먼저 AOP target method를 지정할 @interface를 생성합니다.
public @interface ToLowerOutput {
}
생성된 interface를 지정하는 Pointcut과 Advice를 포함한 Advisor class를 생성합니다.
@Aspect
@Component
public class HelloAdvisor {
@Pointcut(value = "@annotation(me.xyzlast.bookstore.aop.ToLowerOutput)")
private void convertToLowercast() {
}
@Around(value = "convertToLowercast()")
public Object convertResultStringToLower(ProceedingJoinPoint pjp) throws Throwable {
return pjp.proceed().toString().toLowerCase();
}
}
만들어진 @annotation을 class에 적용합니다.
@Component
public class HelloImpl implements Hello {
@ToLowerOutput
@Override
public String sayHello(String name) {
return "Hello " + name + "!";
}
@ToLowerOutput
@Override
public String sayHi(String name) {
return "Hi! " + name + "!";
}
@ToLowerOutput
@Override
public String sayThankYou(String name) {
return "Thank you, " + name + "!";
}
}
Spring configuration을 다음과 같이 수정합니다. 주의할점은 반드시 annotation auto proxy 설정이 bean 정의보다 먼저 위치해야지 됩니다!
<aop:aspectj-autoproxy/>
<bean name="helloImpl" class="me.xyzlast.bookstore.aop.HelloImpl"/>
<bean name="aspectJAOP" class="me.xyzlast.bookstore.aop.HelloAdvisor"/>
이제 test code를 이용하면 모든 값들이 다 소문자로 나오게 되는 것을 볼 수 있습니다.