CGLIB: Code Generator Library
CGLIB는 바이트코드를 조작해서 동적으로 클래스를 생성하는 기술을 제공하는 라이브러리이다.
CGLIB를 사용하면 클래스여도 동적 프록시를 만들어낼 수 있다.
참고로 우리가 CGLIB를 직접 사용하는 경우는 거의 없다.
나중에 ProxyFactory
라는 것이 최종본일 예정이기 때문에 빌드업의 과정일뿐
JDK 동적 프록시를 위해 InvocationHandler
를 사용했듯이,
CGLIB는 MethodInterceptor
를 사용해야한다.
obj
: CGLIB가 적용된 객체
method
: 호출된 메서드
args
: 메서드를 호출하면서 전달된 인수
proxy
: 메서드 호출에 사용
이전과 거의 같은 코드이다.
참고로 method
를 사용해도 되지만 성능은 methodProxy
가 더 좋다고 한다.
이렇게 인터페이스 없는 구체 클래스를 CGLIB를 사용해서 실행한 것을 확인할 수 있다.
Enhander
: CGLIB는 Enhancer
를 사용해서 프록시를 생성한다.
enhancer.setSuperclass(ConcreteService.class)
: CGLIB는 구체 클래스를 상속 받아서 프록시를 생성할 수 있다. 어떤 구체 클래스를 상속 받을지 지정한다.
enhancer.setCallback(new TimeMethodInterceptor(target))
enhancer.create()
: 프록시를 생성한다. 앞서 설정한 enhancer.setSuperclass(ConcreteService.class)
에서 지정할 클래스를 상속 받아서 프록시가 만들어진다.제약
클래스 기반 프록시는 상속을 사용하기 때문에 몇가지 제약이 있다.
final
키워드가 붙으면 상속이 불가능하다. -> CGLIB에서는 예외가 발생final
키워드가 붙으면 해당 메서드를 오버라이딩 할 수 없다.이걸로 v2에 적용할 수 있다. 그런데 기본 생성자를 추가하고, 의존관계를 setter
적용하면 CGLIB 사용할 수는 있는데,
뒤에서 나올 ProxyFactory
를 통해 CGLIB의 단점을 알아보고 그때 적용해보기로.