일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 도메인 주도 개발 시작하기
- vue.js
- AWS RDS
- SQL쿡북
- java
- 이펙티브자바
- 이펙티브 자바
- CleanCode
- 스프링부트와AWS로혼자구현하는웹서비스
- 자바예외
- 자료구조
- 클린코드
- 자바스터디
- AWS
- react
- 알고리즘분석
- DDD
- 혼공SQL
- 기술면접
- 인프런김영한
- 이팩티브 자바
- 인프런백기선
- 자바
- 네트워크
- 알고리즘
- mysql
- jpa
- aop
- MariaDB
- 인덱스
- Today
- Total
기록이 힘이다.
스프링의 해결책 본문
CGLIB 구체 클래스 기반 프록시 문제점
-대상 클래스에 기본 생성자 필수
-생성자 2번 호출 문제
-final 키워드 클래스, 메서드 사용 불가
스프링 3.2, CGLIB를 스프링 내부에 함께 패키징
CGLIB를 사용하려면 CGLIB 라이브러리가 별도로 필요했다. 스프링은 CGLIB 라이브러리를 스프링 내부에 함께 패키징해서 별도의 라이브러리 추가 없이 CGLIB를 사용할 수 있게 되었다. 'CGLIB spring-core org.springframework'
CGLIB 기본 생성자 필수 문제 해결
스프링 4.0부터 CGLIB의 기본 생성자가 필수인 문제가 해결되었다.
'objenesis'라는 특별한 라이브러리를 사용해서 기본 생성자 없이 객체 생성이 가능하다.
참고로 이 라이브러리는 생성자 호출 없이 객체를 생성할 수 있게 해준다.
생성자 2번 호출 문제
스프링 4.0부터 CGLIB의 생성자 2번 호출 문제가 해결되었다.
이것도 역시 'objenesis'라는 특별한 라이브러리 덕분에 가능해졌다.
이제 생성자가 1번만 호출된다.
스프링 부트 2.0 - CGLIB 기본 사용
스프링 부트 2.0 버전부터 CGLIB 를 기본으로 사용하도록 했다.
이렇게 해서 구체 클래스 타입으로 의존관계를 주입하는 문제를 해결했다.
스프링 부트는 별도의 설정이 없다면 AOP를 적용할 때 기본적으로 'proxyTargetClass=true'로 설정해서 사용한다.
따라서 인터페이스가 있어도 JDK 동적 프록시를 사용하는 것이 아니라 항상 CGLIB를 사용해서 구체클래스를 기반으로 프록시를 생성한다.
물론 다음과 같이 설정하면 JDK 동적 프록시도 사용할 수 있다.
application.properties
spring.aop.proxy-target-class=false
AOP를 적용할 대상에는 'final'클래스가 'final'메서드를 잘 사용하지는 않으므로 이 부분은 크게 문제가 되지는 않는다.
'SpringBoot' 카테고리의 다른 글
Relying upon circular references is discouraged and they are prohibited by default. Update your application to remove the dependency cycle between beans. As a last resort, it may be possible to break the cycle automatically by setting spring.main.allow-.. (0) | 2023.07.17 |
---|---|
좋은 설계는 제약이 있는 것이다 (0) | 2023.07.16 |
스프링 빈으로 등록하는 방법 (0) | 2023.07.14 |
스프링 AOP (0) | 2023.07.14 |
AspectJ 프레임워크 (0) | 2023.07.14 |