hanker

Spring - CGLIB (Code Generator Library) 이란? JDK 동적 프록시 차이 본문

SPRING

Spring - CGLIB (Code Generator Library) 이란? JDK 동적 프록시 차이

hanker 2024. 11. 10. 10:45
반응형

CGLIB (Code Generator Library)는 Java에서 동적으로 바이트코드를 생성하여 객체의 프록시를 만드는 라이브러리이다. 주로 Spring Framework에서 AOP(Aspect-Oriented Programming) 기능을 지원하기 위해 사용되고, final 클래스나 인터페이스가 아닌 클래스를 상속하여 동적으로 프록시를 생성한다.

 

Spring 프로젝트에서 동작을 하다보면 종종 보이곤(logging level 이 Debug 로 설정하면) 하는데, Spring에서 AOP구현을 위해 자동으로 사용되기 때문에 우리가 따로 설정할 필요는 거의 없다. 

 

 

반응형
CGLIB의 작동 방식

 
1. 클래스 상속을 통한 프록시 생성 

- CGLIB는 인터페이스가 아닌 구체 클래스를 상속하여 프록시를 생성한다.
(여기서 말하는 구체 클래스란 인터페이스가 없는 클래스나 추상 클래스가 아닌 구체적인 동작을 가진 클래스를 말한다.)
단, 상속 방식을 사용하기 때문에 final 클래스에는 CGLIB이 적용될 수 없다.
 

2. 메서드 오버라이딩

- 프록시 객체는 대상 클래스의 메서드를 오버라이드하여, 메서드 호출 전후에 특정 동작을 추가한다.
예를 들어, 트랜잭션 관리가 필요한 메서드의 경우 트랜잭션을 시작하고 종료하는 코드가 추가된다.
또한 @Aspect를 적용할 때, @Before, @After, @Around 와 같은 애노테이션을 적용해 메서드 호출을 가로채고 추가 동작을 수행할 수 있게한다.
 

3. 바이트코드 생성

- CGLIB는 바이트코드 수준에서 직접 프록시를 생성한다. 즉 성능이 뛰어나고 JDK 동적 프록시보다 빠른경우가 많다.
하지만 메모리를 많이 사용할 수도 있다.

 
 
 

CGLIB vs JDK 동적 프록시
구분CGLIBJDK 동적 프록시
프록시 방식클래스 상속을 통해 서브클래스 생성인터페이스를 구현하는 익명 클래스 생성
적용대상구체 클래스인터페이스
final 클래스 지원X지원
사용 방식@EnableAspectJAutoProxy
(proxyTargetClass = true)
인터페이스가 있을 때 기본으로 사용
성능바이트코드 조작으로 인해 약간 더 빠름리플렉션을 사용하여 성능이 상대적으로 낮음
메모리 사용량더 많은 메모리를 사용상대적으로 적은 메모리 사용
사용 라이브러리CGLIBJava 표준 라이브러리
사용 예Spring AOP, 트랜잭션 관리에서 인터페이스 없는 클래스의 프록시 생성인터페이스가 있는 서비스 클래스의 프록시 생성

CGLIB은 클래스 상속을 통해 프록시를 생성하여 구체 클래스에 적용되며, 인터페이스가 없는 클래스에도 사용할 수 있고, JDK 동적 프록시인터페이스 기반으로 프록시를 생성하며, Spring에서는 인터페이스가 있는 경우 기본적으로 JDK 동적 프록시를 사용한다.
 
 
 
 

로그 활성화

 
application.properties 파일에 logging.level.net.sf.cglib=DEBUG를 추가해주면 CGLIB의 동작 과정을 확인할 수 있다.

 

반응형