Technical Note/etc

CGLIB 는 코드 생성 라이브러리 (code Generator Library) 런타임에 동적으로 자바 클래스의 프록시를 생성해 주는 기능을 제공

CGLIB를 사용하면 매우 쉽게 프록시 객체를 생성할 수 있음, 성능 또한 우수하다.

더불어 인터페이스가 아닌 클래스에 대해서 동적 프록시를 생성할 수 있음

Hibernate는 자바민 객체에 대한 프록시를 생성할때 CGLIB를 사용하며, Spring은 프록시 기반의 AOP를 구현할 때 CGLIB를 사용하고 있음


Proxy에 대하여 : 핵심 기능은 원하는 메서드가 호출될때 이 메서드를 가로채어 우리가 원하는 특정 기능을 추가할 수 있도록 지원하는 것


Spring AOP는 두가지 Type의 Proxy를 지원하고 있다. 

1. JDK의 Proxy 기능 이용

2. CGLIB의 Enhancer 클래스 이용


JDK의 Proxy 

: JDK의 Proxy는 인터페이스에 대한 Proxy만을 지원하며, 클래스에 대한 Proxy를 지원할수 없다는 것이 큰 단점,

또한 이미 구현되어 있는 애플리케이션에 Proxy 기능을 추가할때 JDK Proxy를 사용한다면 클래스로 구현되어 있는 소스에서 인터페이스를 추출한 다음 Proxy를 적용할 수 밖에 없다는 것이 단점

JDK Proxy가 가지는 또 하나의 단점은 Target 클래스에 Proxy를 적용할 때 PointCut에 정보에 따라 Advice되는 메서드와 그렇지 않은 메서드가 존재한다. 그러나 JDK Proxy를 사용할 경우 Target 클래스에 대한 모든 메서드 호출이 일단 JVM에 Intercept한 다음 Advice의 invoke 메소드를 호출하게 된다. 그 후에 이 메서드가 Advice되는 메서드 인지 그렇지 않은지를 판단하게 된다. 이과정에서 JVM에 의하여 Intercept한 다음 Invoke 메소드를 호출할 때 JDK의 reflection을 호출하게 되는것이다. 이는 Proxy를 사용할 때 실행 속도를 상당히 저하시키는 원인이 된다.


CGLIB Proxy

: 이 또한 JDK Proxy처럼 Runtime시에 Target 메서드가 호출될때 해당 메서드의 Advice 적용 여부를 결정함

그러나 CGLIB는 메서드가 처름 호출되었을 때 동적으로 bytecode를 생성하여 이후 호출에서는 재사용 과정을 거침. 그러므로 두번째 호출 부터는 실행 속더의 향상을 가져옴