기존 프록시 팩토리 빈 방식을 통해 두가지 한계점이 있었다.

  • 부가기능이 타깃 오브젝트마다 새로 만들어지는 문제 => 어드바이스를 통해 해결
  • 부가기능의 적용이 필요한 타깃 오브젝트마다 비슷한 내용의 ProxyFactoryBan 빈 설정정보를 추가해주는 부분 => 어떻게 중복을 제거할까?

빈 후처리기를 이용한 자동 프록시 생성기

빈 후처리기는 이름 그대로 스프링 빈 오브젝트로 만들어지고 난 후에, 빈 오브젝트를 다시 가공할 수 있게 해준다.여기서는 스프링이 제공하는 빈 후처리기 중 하나인 DefaultAdvisorAutoProxyCreator를 살펴본다. 이 클래스는 어드바이저를 이용한 자동 프록시 생성기다. 빈 후처리기를 스프링에 적용하는 방법은 간단하다. 빈 후처리기 자체를 빈으로 등록하는 것이다. 스프링은 빈 후처리가 빈으로 등록되어 있으면, 빈 오브젝트가 생성될 때마다 빈 후처리기에 보내 후처리 작업을 요청한다.

  1. 스프링 빈 후처리기를 빈으로 등록
  2. 빈 오브젝트 생성
  3. 빈 후처리기에 전달하여 후처리 작업 요청

이 과정에서 빈 오브젝트의 프로퍼티를 강제로 수정할 수 있고 별도의 초기화 작업을 수행할 수도 있다. 심지어는 만들어진 빈 오브젝트를 바꿔치기 할 수도 있다. 다라서 스프링이 설정을 참고해서 만든 오브젝트가 아닌 다른 오브젝트를 빈으로 등록하는 것이 가능하다.
이를 이용해 스프링이 생성하는 빈 오브젝트의 일부를 프록시로 포장하고, 프록시를 빈으로 등록 할 수 있다.이게 자동 프록시 생성 빈 후처리기다. 자동 프록시 생성 방법은 아래와 같다.

  1. DefaultAdvisorAutoProxyCreator 빈 후러치기가 등록되어 있으면 스프링은 빈 오브젝트를 만들 때마다 후처리기에게 빈을 보낸다.
  2. DefaultAdvisorAutoProxyCreator는 빈으로 등록된 모든 어드바이저 내의 포인트 컷을 이용해 전달받은 빈이 프록시 적용 대상인지 확인한다.
  3. 프록시 적용 대상이면 그때는 내장된 프록시 생성기에게 현재 빈에 대한 프록시를 만들게 하고, 만드러진 프록시에 어드바이저를 연결해준다.
  4. 빈 후처리기는 프록시가 생성되면 원래 컨테이너가 전다해준 빈 오브젝트 대신 프록시 오브젝트를 컨테이너에게 돌려준다.
  5. 컨테이너는 최종적으로 빈 후처리기가 돌려분 오브젝트를 빈으로 등록하고 사용한다.

확장된 포인트 컷

지금까지 포인트 컷은 타깃 오브젝트의 메소드 중에서 어떤 메소드에 부가기능을 적용할지를 선정해주는 역할을 하였다. 하지만 앞서 말한 빈 후처리기에서의 포인트 컷은 등록된 빈 중에서 어떤 빈에 프록시를 적용해줄지 선택한다는 식으로 이야기 했다. 이게 가능할까? 가능하다. 포인트컷은 클래스 필터와 메소드 매처 두가지를 돌려주는 메소드를 갖고 있다. 실제 포인트컷 선별 로직은 이 두가지 타입의 오브젝트에 담겨 있다.

public interface Pointcut {
    Pointcut TRUE = TruePointcut.INSTANCE;

    ClassFilter getClassFilter();

    MethodMatcher getMethodMatcher();
}

만약 Pointcut 선정 기능을 모두 적용한다면, 먼저 프록시를 적용할 클래스인지 판단하고 나서 적용 대상 클래스인 경우 어드바이스를 적용할 메소드인지 확인하는 식으로 동작한다.


참고자료 :

  1. 토비의 스프링 3.1 6장 AOP - 6.5

oksusutea's blog

꾸준히 기록하려고 만든 블로그