Spring 2.0 AOP
참조 : 3월달 마소 AOP 특집 중 토비님의 Spring 2.0 AOP
AOP를 구현 하는 방법.
1. AOP 언어 자체를 확장하는 방법 - AspectJ - 전용 컴파일러 필요함.
2. 그냥 자바 클래스에 설정파일이나 어노테이션을 사용하는 방법
2-1. 컴파일 된 클래스를 변환하는 방법
2-2. 클래스 로딩 시 바이트 코드를 조작하는 방법
2-3. 순수한 자바 언어와 API만을 사용하는 방법 - Spring AOP
Spring AOP는 프록시 기반의 AOP 구현 방법을 사용.
1. 인터페이스에 대한 프록시 만들 때 - JDK의 Dynamic Proxy사용
2. 클래스에 대한 프록시 만들 때 - CGLib 사용
기존 Spring AOP.
1. 포인트컷(Pointcut)
조인 포인트-Spring AOP는 메소드 실행 시점만 지원-의 묶음
Spring 1.X 버전에서는 스태틱 포인트컷과 다이내믹 포인트컷 방식이 있다.
2. 어드바이스(Advice)
Interception arount 어드바이스 : 메소드 실행 전 후 모두, 대상이 되는 메소드의 실행 여부 결정 가능 (ex, MethodInterceptor)
Before 어드바이스 : 메소드 실행 전에
Throws 어드바이스 : 메소드에서 예외 발생 했을 때
After Return 어드바이스 : 메소드 실행 후에
Introduction 어드바이스 : 기본의 클래스에 동적으로 필드나 메소드 추가
3. 어드바이저(Advisor)
Advice + Pointcut = Aspect = 어드바이져(ex. DefaultPointcutAdvisor)
4. 프록시
ProxyFactoryBean : target, proxyIntergace, interceptorNames 속성을 주입하여 사용.
AutoProxyCreator(ex. BeanNameAutoProxyCreator) : BeanPostProcessor를 사용하여 임의의 빈에 다이내믹하게 프록시 설정 부여함.
5. 한계와 단점
5-1. Pointcut 인터페이스 구현해야함. 포인트컷 표현, 적용이 어렵다.
5-2. XML 설정이 복잡해 진다.
5-3. IoC 컨테이너에 빈으로 등록되지 않은 객체는 적용할 수 없다.
5-4. 약간의 성능저하
5-5. 타깃 객체와 프록시가 분리되어 있다,
Spring 2.0 AOP.
1. AspectJ의 애스펙트 선언과 포인트컷 언어 도입
한계와 단점에서 첫 번째와 두 번째 문제 해결
2. AspectJ AOP 이용방법
AspectJ를 사용하여 세번째 문제 해결 가능.(@Configurable 사용)
2-1. Spring 설정과 무관하게 사용.
2-2. 에스팩트 정의를 빈으로 등록.(factory-method="aspectOf" 사용)