JDK Dynamic Proxy, CGLIB

sixhustle·2021년 12월 7일
0

Spring

목록 보기
6/10

들어가기 전에

Proxy

Target의 기능을 수행하면서 기능을 확장하거나 추가된 실제 객체를 의미합니다.

Spring AOP

Spring은 AOP기능을 Proxy 기반으로 제공하고 있습니다.
JDK Dynamic Proxy와 CGLIB을 활용하여 AOP를 제공하고 있습니다.

  1. 지양하는 코드 : 개발자가 직접 공통 기능(log)를 대입하는 코드
  2. 지향하는 코드 : 공통 기능(log)를 관점(aspect)으로 분리하고, 각 method에서 관점을 적용하는 코드
  3. 지향하는 코드의 내부 동작

JDK Dynamic Proxy

Object proxy = Proxy.newProxyInstance(
   ClassLoader, 
   Class<?>[],
   InvocationHandler
);
  1. interface 기반의 proxy
  2. target class가 interface를 구현하고 있어야하는 단점이 있음
  3. 특정 Object에 대해 Reflection을 사용하기 때문에 성능이 떨어지는 단점이 있음

Reflection

구체적인 class type을 몰라도 그 class의 method, type, variables에 접근할 수 있는 기능
동적으로 class를 load하고, heap에 객체를 생성하는 절차가 있어 성능 이슈가 있는듯?!


CGLIB (Code Generator Library)

Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(Target.class); 
enhancer.setCallback(MethodInterceptor);

Object proxy = enchancer.create(); // proxy 생성
  1. class를 상속받아 bytecode를 조작하여 proxy 객체를 생성

Conclusion

이전에는

Enhander 의존성 추가, default 생성자 필요, target의 생성자 2번 호출의 단점으로 인해 Spring에서는 CGLIB를 권장하지 않음.

지금은

Spring 3.2버전부터 Spring Core 패키지에 cglib가 포함되었고,
4버전에는 Objensis의 도움으로 default 생성자 없이 proxy 생성할 수 있고,
생성자가 2번 호출되는 단점도 개선되었다고 합니다.

결과적으로

cglib의 한계들이 개선되어 Spring에서는 성능이 좋은 CGLIB로 Proxy를 생성하게 되었다고 합니다.


References

Reflection

0개의 댓글