CGLIB는 바이트코드를 조작하여 클래스 파일기반으로 Proxy를 만드는 라이브러리다. 인터페이스를 기반으로 Proxy를 만드는 JDK Proxy와 대조적이다.
JDK Proxy를 만들기 위해선 InvocationHandler를 구현한 객체를 사용해서 proxy를 만들었는데 CGLIB은 MathodInterceptor를 구현한 객체를 사용하면 된다.
//target Object
public class CGLibService {
void test(){
System.out.println("CGLibService 타겟 메서드 실행");
}
}
//Proxy Object
public class CGMethodInterceptor implements MethodInterceptor {
private final Object target;
public CGMethodInterceptor(Object target) {
this.target = target;
}
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
System.out.println("MethodInterceptor 시작");
Object result = proxy.invoke(target, args);
System.out.println("MethodInterceptor 끝");
return result;
}
}
@Test
void cglibMaker(){
CGLibService cgLibService = new CGLibService();
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(CGLibService.class);
enhancer.setCallback(new CGMethodInterceptor(cgLibService));
CGLibService proxy = (CGLibService) enhancer.create();
proxy.test();
System.out.println(proxy.getClass());
}
CGLIB Proxy를 만드는 코드는 생각보다 간단하다. 중요한 것은
정도다.
위 코드를 실행하면 아래와 같이 나오는데
MethodInterceptor 시작
CGLibService 타겟 메서드 실행
MethodInterceptor 끝
class com.lab.spring.cglib.CGLibService$$EnhancerByCGLIB$$f7fd217b
proxy의 클래스가 EnhancerByCGLIB인걸 확인 할 수 있다.
한 줄평 : 스프링 부트2.0 버전 부터는 CGLIB을 기본 Proxy로 사용한다고 한다.