기존 프록시 팩토리 빈 방식을 통해 두가지 한계점이 있었다.
- 부가기능이 타깃 오브젝트마다 새로 만들어지는 문제 => 어드바이스를 통해 해결
- 부가기능의 적용이 필요한 타깃 오브젝트마다 비슷한 내용의 ProxyFactoryBan 빈 설정정보를 추가해주는 부분 => 어떻게 중복을 제거할까?
빈 후처리기를 이용한 자동 프록시 생성기
빈 후처리기는 이름 그대로 스프링 빈 오브젝트로 만들어지고 난 후에, 빈 오브젝트를 다시 가공할 수 있게 해준다.여기서는 스프링이 제공하는 빈 후처리기 중 하나인 DefaultAdvisorAutoProxyCreator를 살펴본다. 이 클래스는 어드바이저를 이용한 자동 프록시 생성기다. 빈 후처리기를 스프링에 적용하는 방법은 간단하다. 빈 후처리기 자체를 빈으로 등록하는 것이다. 스프링은 빈 후처리가 빈으로 등록되어 있으면, 빈 오브젝트가 생성될 때마다 빈 후처리기에 보내 후처리 작업을 요청한다.
- 스프링 빈 후처리기를 빈으로 등록
- 빈 오브젝트 생성
- 빈 후처리기에 전달하여 후처리 작업 요청
이 과정에서 빈 오브젝트의 프로퍼티를 강제로 수정할 수 있고 별도의 초기화 작업을 수행할 수도 있다. 심지어는 만들어진 빈 오브젝트를 바꿔치기 할 수도 있다. 다라서 스프링이 설정을 참고해서 만든 오브젝트가 아닌 다른 오브젝트를 빈으로 등록하는 것이 가능하다.
이를 이용해 스프링이 생성하는 빈 오브젝트의 일부를 프록시로 포장하고, 프록시를 빈으로 등록 할 수 있다.이게 자동 프록시 생성 빈 후처리기다. 자동 프록시 생성 방법은 아래와 같다.
- DefaultAdvisorAutoProxyCreator 빈 후러치기가 등록되어 있으면 스프링은 빈 오브젝트를 만들 때마다 후처리기에게 빈을 보낸다.
- DefaultAdvisorAutoProxyCreator는 빈으로 등록된 모든 어드바이저 내의 포인트 컷을 이용해 전달받은 빈이 프록시 적용 대상인지 확인한다.
- 프록시 적용 대상이면 그때는 내장된 프록시 생성기에게 현재 빈에 대한 프록시를 만들게 하고, 만드러진 프록시에 어드바이저를 연결해준다.
- 빈 후처리기는 프록시가 생성되면 원래 컨테이너가 전다해준 빈 오브젝트 대신 프록시 오브젝트를 컨테이너에게 돌려준다.
- 컨테이너는 최종적으로 빈 후처리기가 돌려분 오브젝트를 빈으로 등록하고 사용한다.
확장된 포인트 컷
지금까지 포인트 컷은 타깃 오브젝트의 메소드 중에서 어떤 메소드에 부가기능을 적용할지를 선정해주는 역할을 하였다. 하지만 앞서 말한 빈 후처리기에서의 포인트 컷은 등록된 빈 중에서 어떤 빈에 프록시를 적용해줄지 선택한다는 식으로 이야기 했다. 이게 가능할까? 가능하다. 포인트컷은 클래스 필터와 메소드 매처 두가지를 돌려주는 메소드를 갖고 있다. 실제 포인트컷 선별 로직은 이 두가지 타입의 오브젝트에 담겨 있다.
public interface Pointcut {
Pointcut TRUE = TruePointcut.INSTANCE;
ClassFilter getClassFilter();
MethodMatcher getMethodMatcher();
}
만약 Pointcut 선정 기능을 모두 적용한다면, 먼저 프록시를 적용할 클래스인지 판단하고 나서 적용 대상 클래스인 경우 어드바이스를 적용할 메소드인지 확인하는 식으로 동작한다.
참고자료 :