AOP : 관점지향 프로그래밍
AOP - 횡단 관심사와 주요 관심사를 분리해서 관점별로도 기능을 모듈화 할 수 있음
AOP의 주요 용어
Aspect
Join Point
Advice
Point Cut
Target Object
AOP Proxy
Advisor(Spring AOP만 사용되는 용어)
Weaving
Spring AOP vs @AspectJ
@AspectJ는 잘 쓰지는 않는다. 하지만 지원한다(정확히는 @AspectJ 스타일을 지원한다)
@AspectJ 지원 활성화 (@EnableAspectJAutoProxy)
태그 없으면 <aop:aspectj-autoproxy>로 xml에 직접 지정
AspectJ 사용 사진
포인트 컷 : 타겟의 여러 조인 포인트 중 어드바이스(@Advice(before,after))를 적용할 대상을 지원하는 키워드
포인트컷 선언은 표현식과 시그니쳐로 나누어짐
@Pointcut("execution(* transfer(..))") // the pointcut expression
private void anyOldTransfer() {} // the pointcut signature
포인트 컷 표현식
포인트컷 지정자 (Pointcut Designator)
execution (거의 대부분 이걸 사용)
within
excution vs within
@Pointcut("execution(boolean com.test.edu.springframework.testing.service.Tester.sayHello())")
public void testerPointCut(){}
@Pointcut("within(com.test.edu.springframework.testing.service.Tester)")
public void testerPointCut(){}
this
target
args (파라미터로 이런걸 받는 애들을 매칭할래)
@taget
주어진 타입의 애너테이션을 가진 클래스의 인스턴스를 매칭
@args
실제 인수의 런타임 타입이 주어진 타입의 애너테이션을 가질 경우 매칭
@within
주어진 타입의 애너테이션을 타입들로 제한하여 매칭
@annotation
주어진 애너테이션을 가지고 있을 경우 매칭
포인트컷은 조합식을 통해 조합할 수 있다.
// anyPublicOperation 포인트컷은 모든 public 메소드 실행에 매칭 됩니다.
@Pointcut("execution(public * *(..))")
private void anyPublicOperation() {}
// inTrading 포인트컷은 com.xyz.myapp.trading 패키지 내의 메소드 실행에 매칭
@Pointcut("within(com.xyz.myapp.trading..*)")
private void inTrading() {}
// tradingOperation 포인트컷은 com.xyz.myapp.trading 패키지 내의 퍼블릭 메소드 실행에 매칭
@Pointcut("anyPublicOperation() && inTrading()")
private void tradingOperation() {}
Advice