개발이론/JAVA

JDK Dynamic Proxy vs CGLIB Proxy

TedDev 2024. 11. 12. 18:06
728x90

프록시(Proxy) 패턴이란?

프록시는 클라이언트가 특정 대상(타깃)에 접근할 때 그 접근을 제어하거나 부가 기능을 제공하기 위해 중간에 위치한 객체이다. 클라이언트는 실제 타깃이 아닌 프록시를 통해 작업을 수행하며 프록시는 타깃 객체에 메서드 호출을 위임한다.

프록시 패턴은 주 기능 외 부가 기능(예: 로깅, 보안, 트랜잭션 관리)을 추가할 때 사용된다. JDK Dynamic ProxyCGLIB Proxy는 Java에서 프록시를 구현하는 두 가지 대표적인 방식이다.

 

JDK Dynamic Proxy

  • 특징 : JDK Dynamic Proxy는 인터페이스 기반의 프록시를 생성한다. 런타임 시 인터페이스를 구현하는 프록시 객체를 동적으로 생성해 클라이언트와 타깃 객체 사이의 중간 역할을 한다.
  • 작동 방식 : java.lang.reflect.Proxy 클래스와 InvocationHandler 인터페이스를 사용해 구현한다. InvocationHandler가 메서드 호출을 처리하며 메서드 실행 전후로 부가 기능을 추가할 수 있다.
  • 장점 및 단점
    • 장점 : 인터페이스만 있으면 되므로 유연하고 가볍다.
    • 단점 : 인터페이스가 필요하며 인터페이스가 없는 클래스에는 적용할 수 없다.

 

CGLIB Proxy

  • 특징 : CGLIB는 클래스 상속 기반의 프록시를 생성한다. 이를 통해 인터페이스가 없어도 동작하기 때문에 JDK Dynamic Proxy의 한계를 보완할 수 있다.
  • 작동 방식 : CGLIB는 바이트코드 조작을 통해 프록시 클래스를 생성한다. 프록시는 타깃 클래스를 상속하여 MethodInterceptor를 통해 메서드 호출을 인터셉트하고 부가 기능을 추가할 수 있다.
  • 장점 및 단점
    • 장점 : 클래스 상속 방식을 사용하므로 인터페이스가 없어도 적용할 수 있다.
    • 단점 : 상속 구조를 사용하므로 성능이 다소 떨어질 수 있으며 메모리 소모가 증가할 수 있다.

 

728x90

JDK Dynamic Proxy vs CGLIB Proxy의 차이점

  • 적용 대상 : JDK Dynamic Proxy는 인터페이스가 있는 경우에 사용하고 CGLIB Proxy는 클래스에 직접 적용 가능하다.
  • 성능 : JDK Dynamic Proxy가 CGLIB보다 메모리 효율성이 높지만 CGLIB은 클래스 기반이기 때문에 더 유연하게 적용할 수 있다.
  • 부가 기능 : 두 프록시 모두 메서드 호출 전후에 부가 기능을 추가할 수 있으며 주로 로깅, 트랜잭션 처리, 메서드 실행 타이밍 측정 등에서 활용된다.

 

스프링 프레임워크에서의 활용

스프링은 프록시 패턴을 활용해 AOP(Aspect-Oriented Programming) 기능을 제공한다. 예를 들어, 트랜잭션 관리, 보안, 로깅 등의 부가기능을 메서드 호출 전후에 추가할 수 있다.

  • 스프링 3.2 이후, CGLIB Proxy 사용 시 기본 생성자가 필요하지 않고 더 개선된 성능을 제공한다. 이는 스프링이 CGLIB의 의존성을 줄여 더 유연하게 객체를 생성할 수 있도록 한 내용이다.

 

요약

  • JDK Dynamic Proxy : 인터페이스가 있는 경우 사용, 가볍고 효율적이지만 인터페이스가 필요함.
  • CGLIB Proxy : 클래스에 직접 적용 가능. 인터페이스가 없어도 사용 가능하나 성능 면에서 다소 부담이 있음.
  • 스프링과 프록시 : 스프링은 JDK Dynamic Proxy와 CGLIB Proxy를 모두 사용하여 AOP 기능을 제공하고 부가기능을 손쉽게 적용할 수 있도록 한다.
반응형