스프링이 유사한 구체 기술들이 있을 때 일관성있게 접근하고, 편리하게 추상화된 기술을 제공한다.
동적 프록시를 통합해서 편리하게 만들어주는 ProxyFactory 라는 기능을 지원한다.
스프링은 InvocationHandler와 MethodInterceptor를 중복으로 만들지 않고 관리하도록 Advice라는 개념을 도입했다.
개발자는 InvocationHandler와 MethodInterceptor를 신경쓰지말고 Advice만 만들면된다.
프록시 팩토리를 사용하면 Advice를 호출하는 전용 InvocationHandler와MethodInterceptor를 내부에서 사용한다.
Advice를 만드는 것은 인터페이스를 구현하면 된다.
CGLIB에서 제공하는 MethodInterceptor와 이름이 같으므로 주의하자.
MethodInterceptor → Interceptor → Advice 관계다
package org.aopalliance.intercept;
public interface MethodInterceptor extends Interceptor {
Object invoke(MethodInvocation invocation) throws Throwable;
}
Adice를 만들어서 주입해주면 Interface 인지, 구체클래스인지 ProxyFactory가 판단하여 프록시를 반환한다.
ProxyTargetClass 값을 true로 주면, 인터페이스의 존재에 관계없이 CGLIB을 사용한다. SpringBoot 2.0 이상은 true를 줘서 항상 CGLIB을 사용하고 있다.
Advice 작동원리에 맞춘 가벼운 설명
만약 2번 필터에서 적용대상이 아니라면 4번을 바로 호출한다.
프록시 팩토리를 이용하여 구체 클래스도 CGLIB으로 프록시로 만들 수 있게 됐다.
하지만 여전히 한계가 있는데,
1. 스프링 빈 개수만큼 설정을 해야한다.
2. 컴포넌트 스캔으로 찾은 빈을 프록시로 변경할 수 있다.
이를 해결하기 위해서 빈 후처리기를 이용할 수 있다.