일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- JPQL
- exe
- em
- 애널리틱스4
- spring
- IntelliJ
- JPA
- ci/cd
- db종류
- 프로시저
- Def
- git
- ==
- repository
- 자동배포
- java
- jetbrain
- 티스토리챌린지
- Jenkins
- Python
- chown
- docker
- EntityManager
- 트랜잭션
- analytics4
- define
- gtihub
- 오블완
- MariaDB
- Today
- Total
hanker
Spring - CGLIB (Code Generator Library) 이란? JDK 동적 프록시 차이 본문
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 동적 프록시
구분 | CGLIB | JDK 동적 프록시 |
프록시 방식 | 클래스 상속을 통해 서브클래스 생성 | 인터페이스를 구현하는 익명 클래스 생성 |
적용대상 | 구체 클래스 | 인터페이스 |
final 클래스 지원 | X | 지원 |
사용 방식 | @EnableAspectJAutoProxy (proxyTargetClass = true) | 인터페이스가 있을 때 기본으로 사용 |
성능 | 바이트코드 조작으로 인해 약간 더 빠름 | 리플렉션을 사용하여 성능이 상대적으로 낮음 |
메모리 사용량 | 더 많은 메모리를 사용 | 상대적으로 적은 메모리 사용 |
사용 라이브러리 | CGLIB | Java 표준 라이브러리 |
사용 예 | Spring AOP, 트랜잭션 관리에서 인터페이스 없는 클래스의 프록시 생성 | 인터페이스가 있는 서비스 클래스의 프록시 생성 |
CGLIB은 클래스 상속을 통해 프록시를 생성하여 구체 클래스에 적용되며, 인터페이스가 없는 클래스에도 사용할 수 있고, JDK 동적 프록시는 인터페이스 기반으로 프록시를 생성하며, Spring에서는 인터페이스가 있는 경우 기본적으로 JDK 동적 프록시를 사용한다.
로그 활성화
application.properties 파일에 logging.level.net.sf.cglib=DEBUG를 추가해주면 CGLIB의 동작 과정을 확인할 수 있다.
'SPRING' 카테고리의 다른 글
Spring - IntelliJ에서 Spring 시작하기 (java 1.8 spring 버전 다운그레이드) (0) | 2024.11.04 |
---|---|
Spring - JPQL(Java Persistence Query Language) 완벽 정리 (2) | 2024.10.24 |
Spring - JPA EntityManager 완벽 정복 (0) | 2024.10.23 |
Spring - 프로시저 롤백처리 방법에 관해(TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()) (0) | 2024.10.16 |
Spring boot - application.properties Oracle DB 설정 (properties/yml) (0) | 2024.10.10 |