이전에 잠시 ProxyFactoryBean을 사용하여 일일히 Proxy 객체를 만드는 것이 얼마나 피곤할 수 있는지 언급을 했었습니다.

aspect가 적용 될 부분이 객체 단위로 나눠 진다면 저렇게 하는게 편할 수도 있겠지만 그냥 타겟 객체를 멤버로 가지고 타겟 객체의 인터페이스를 구현하면서 타겟 객체의 메소드를 활욜하여 원하는 대로 구현하면 되니까요. 굳이 복잡하게 프록시 객체니 AOP니 사용할 필요가 없겠죠.

하지만 여러 객체을 관통하여 그 객체의 곳곳에 침투 해야 하는 Advice라면 어떻게 해야 할까요? 그 여러 객체에 해당하는 모든 프록시 객체를 만들어 줘야 하겠죠. Spring AOP는 프록시 객체를 사용하기 때문에 그렇게 될 것입니다.

이럴 때 Spring IoC container에 AbstractAutoProxyCreator 를 등록해 두면 컨테이너가 알아서 프록시들을 자동으로 생성해 주게 됩니다. 이 기능을 사용하면 굉장히 편하겠죠.

다음은 AbstractAutoProxyCreator를 상속한 클래스들 입니다.

BeanNameAutoProxyCreator, AbstractAdvisorAutoProxyCreator, AspectJAwareAdvisorAutoProxyCreator, DefaultAdvisorAutoProxyCreator, AnnotationAwareAspectJAutoProxyCreator

BeanNameAutoProxyCreator 사용 예

인터페이스를 구현하지 않은 객체들의 프록시도 필요할 수 있기 때문에 CGLIB jar파일을 필요로 합니다.

BeanPostProcessor를 사용하여 프록시 객체의 대상이 될 객체들을 찾아내서 그 객체들이 호출되기 전에 인터셉터들(어드바이스)을 끼워넣습니다.