[Java] JDK Dynamic Proxy와 CGLIB의 차이점

minhye kim·2024년 4월 29일

Java

목록 보기
2/11

프록시 패턴에는 Java의 많은 애플리케이션 시나리오가 있으며 정적 코드와 동적 프록시가 있다. 정적 프록시는 작성, 컴파일 또는 로드 시 코드를 짜서 구현되는 반면, 동적 프록시는 런타임에 구현된다. 간단히 말해서 정적 프록시는 런타임 이전에 존재하는 반면 동적 프록시는 런타임에 존재한다.
동적 프록시에는 두 가지 구현 방식이 있다.

1. JDK Dynamic Proxy

JDK 프록시는 JDK와 함께 제공되며 외부 라이브러리 도입이 필요없다. Java Reflection API를 사용하여 인터페이스를 구현하여 동적으로 프록시 객체를 생성한다.
메서드 호출 시, InvocationHandler의 invoke 메서드를 통해 인터셉트하고 처리한다다.

장점

  • 간단하고 코드 작성이 용이
  • 인터페이스 기반이기 때문에 다양한 타겟 객체에 적용 가능

단점

  • 최종 클래스에 대한 접근 권한이 필요
  • 인터페이스를 구현하지 않은 클래스에는 적용 불가

2. CGLIB

CGLib는 ASM 기술을 통해 바이트코드 조작 라이브러리를 사용하여 클래스 기반으로 상속을 통해 동적으로 프록시 객체를 생성합니다.

장점

  • JDK Dynamic Proxy보다 성능이 우수
  • 인터페이스를 구현하지 않은 클래스에도 프록시를 적용 가능
  • 상속 관계를 통해 프록시를 생성하기 때문에 더 많은 제어가 가능

단점

  • JDK Dynamic Proxy보다 코드 작성이 복잡
  • 부모 클래스에 final이 있으면
  • 바이트코드 조작 기술을 사용하기 때문에 보안 취약점에 대한 우려
  • 별도의 라이브러리를 추가적으로 설치

3. 비교

일반적으로 CGLIB는 바이트코드 조작 방식으로 인해 JDK Dynamic Proxy보다 성능이 우수하다. 하지만, 프록시 객체의 활용 방식과 환경에 따라 성능 차이는 달라질 수 있다.
두 가지 방식을 경우에 따라 사용하는 방식을 스프링에서 지원(ProxyFactory)하고 있다.

profile
안녕하세요. 블로그를 시작하게 되었습니다! 앞으로 유용한 정보와 좋은 내용을 많이 공유할게요:)

0개의 댓글