본문 바로가기

아는 만큼 보인다/Spring Framework

프록시 팩토리빈 ==> 빈 후처리기(BeanPostProcessor)

프록시 팩토리빈을 사용해서..

Pointcut과 Advice를 재사용할 수 있게되었다. 

그런데 target 설정을 위해 ApplicationContext 설정파일 내에서 프록시 팩토리빈의 설정은 줄일 수 없다.

단지 타겟만 바꿔가면서 프록시를 생성하고 싶은 타켓의 수 만큼 프록시 팩토리빈을 설정해줘야 한다. 


그러나,
빈후처리기를 사용하면 프록시 팩토리빈의 설정을 단 한번도 안해도 된다. 


<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>

위와 같이 ApplicationContext 설정파일에 빈후처리기를 등록하면,
스프링은 먼저 등록된 빈중에 모든 Advisor 들을 취합하여 빈후처리기에게 준다. 

그리고 빈후처리기는 등록된 빈을 생성할 때 마다..
생성된 빈의 클래스(타입)가 취합된 Advisor의 Pointcut에서 지정한 클래스 패턴과 일치하는 지 검사하고, 
일치하는 경우.. 방금 생성된 빈을 프록시 오브젝트로 대체해준다. 

대체된 프록시 오브젝트에는 당연히 해당 Advisor가 주입되어 있다.


이렇게 사용되는 Advisor에는 Advice와 Pointcut의 조합으로 이뤄져있음을 상기하자.

Advice는 메소드에 부가기능을 부여해주는 MethodInterceptor의 구현체이고,

Pointcut은 부가기능을 적용할 메소드를 선별하기 위해 적용하고픈 메소드이름의 패턴을 설정하는 용도였다.

여기서 Pointcut은 후처리하고 싶은 클래스이름의 패턴도 설정해줘야 한다.
그래야만 빈후처리기(DefaultAdvisorAutoProxyCreator)가 빈이 생성될때마다 프록시 오브젝트을 생성해서 바꿔줘야 할지 말지를 판단할 수 있다.

즉, Advisor안의 Pointcut은 두 가지 용도로 사용된다.
한 번은 스프링이 처음에 빈을 생성할때 후처리해줘야 할  클래스인지를 검사하는 용도고
다른 한 번은 런타임중에 프록시오브젝트의 함수가 호출될 때 부가기능을 적용할 메쏘드 호출인지 검사하는 용도다.