참조 : 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" 사용)