CGLIB Proxy란?

무지성개발자·2023년 10월 9일
0

CGLIB

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를 만드는 코드는 생각보다 간단하다. 중요한 것은

  • Enhancer를 통해 CGLIB Proxy를 만든다.
  • setSuperclass()로 target클래스를 상속받아 객체 타입을 맞춰준다.
  • setCallback()를 통해 MethodInterceptor객체를 등록한다.

정도다.

위 코드를 실행하면 아래와 같이 나오는데

MethodInterceptor 시작
CGLibService 타겟 메서드 실행
MethodInterceptor 끝
class com.lab.spring.cglib.CGLibService$$EnhancerByCGLIB$$f7fd217b

proxy의 클래스가 EnhancerByCGLIB인걸 확인 할 수 있다.


한 줄평 : 스프링 부트2.0 버전 부터는 CGLIB을 기본 Proxy로 사용한다고 한다.

profile
no-intelli 개발자 입니다. 그래도 intellij는 씁니다.

0개의 댓글