| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 | 31 |
- java
- 스프링
- AWS SAA-C03 합격후기
- 백준
- BFS
- stop the world
- 파이썬 리스트 메서드
- 객체지향
- 심볼릭 레퍼런스
- 파이썬 문자열 메서드
- dfs
- python
- getreference
- 파이썬
- 2026 AWS SAA-C03
- 어플리케이션 클래스 로더
- 클래스 로더 계층
- 알고리즘
- Spring
- aws saa-c03
- 자료구조
- 스프링 컨테이너
- 플랫폼 클래스 로더
- 부트스트랩 클래스 로더
- 자바
- 다이렉트 레퍼런스
- 딕셔너리
- 컴포넌트 스캔
- 코딩테스트
- python list method
- Today
- Total
클라우드 낚시꾼
[Spring] @Configuration과 CGLIB 본문
1. @Configuration과 싱글톤이 깨지는 것처럼 보이지만...

AppConfig 클래스에 @Configuration 어노테이션을 사용했다. @Configuration이 붙은 클래스는 Spring의 설정 클래스로서 스프링 컨테이너에 Bean을 등록할 수 있게 해준다. 설정 클래스 AppConfig에는 @Bean 어노테이션이 붙은 3개의 메서드가 있다. 그래서 총 3개의 Bean이 싱글톤 객체로 컨테이너에 등록될 것이다.
왼쪽 그림은 등록된 Bean들 사이의 의존관계이다. 오른쪽 코드를 보면, memberService, orderService, memberRepository를 Bean으로 등록할 때 memberRepository 메서드가 3번 호출되어 싱글톤이 깨지는 것처럼 보인다. 하지만, 실상 memberRepository는 싱글톤 객체로 등록되며 공유되어 사용된다. 어떻게 이것이 가능할까?
2. @CGLIB와 바이트코드 조작

new AnnotationApplicationContext로 스프링 컨테이너를 생성할 때, AppConfig.class라는 설정 클래스를 파라미터로 넘겨주었다. 이때, AnnotationApplicationContext에 파라미터로 넘어간 값(설정 클래스)도 스프링 컨테이너에 Bean으로 등록된다. 위의 그림을 보니 AppConfig 설정 클래스가 컨테이너 Bean으로 잘 등록되어 있다. 그런데 예상과는 다르게 클래스 명에 xxxCGLIB가 붙어있다. 이것은 내가 만든 클래스가 아니라 스프링이 CGLIB라는 바이트코드 조작 라이브러리를 사용해서 AppConfig 클래스를 상속받은 임의의 다른 클래스를 만들고, 그 다른 클래스를 스프링 빈으로 등록한 것이다. 그 임의의 다른 클래스가 바로 싱글톤이 보장되도록 해준다. 아마도 아래와 같이 바이트 코드를 조작해서 작성되어 있을 것이다.

@Bean이 붙은 메서드마다 이미 스프링 빈이 존재하면 존재하는 빈을 반환하고, 스프링 빈이 없으면 생성해서 스프링 빈으로 등록하고 반환하는 코드가 동적으로 만들어진다. 덕분에 싱글톤이 보장되는 것이다. 참고로, @Configuration을 붙이면 바이트코드를 조작하는 CGLIB 기술을 사용해서 싱글톤을 보장하지만, @Bean은 스프링 빈으로 등록만할 뿐 싱글톤을 보장하지 않는다.
3. 세줄 요약( +출처 )
- @Configuration은 CGLIB 기술이 적용되어 Bean의 싱글톤을 보장한다.
- @Bean은 CGLIB 기술이 적용되지 않아 Bean으로는 등록되나 싱글톤을 보장하지 못한다.
- 스프링은 CGLIB 바이트 코드 조작 라이브러리를 사용해 Bean으로 등록될 객체의 클래스를 상속받아 다른 객체를 만들고 그 객체를 컨테이너에 Bean으로 등록한다. 이 기술 덕분에 Bean이 싱글톤 객체로 등록된다.
스프링 핵심 원리 - 기본편 강의 - 인프런
스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., 스프링 핵심 원리를 이해하고, 성장하는 백엔드 개발자가 되어보세요! 📢
www.inflearn.com
'BE Framework > SpringBasic' 카테고리의 다른 글
| [Spring] 컴포넌트 스캔: 탐색 위치와 기본 스캔 대상 & 필터 (0) | 2024.03.16 |
|---|---|
| [Spring] 컴포넌트 스캔과 스프링 빈 자동 주입 (0) | 2024.03.16 |
| [Spring] 싱글톤 패턴과 싱글톤 컨테이너 (0) | 2024.03.13 |
| [Spring] 스프링 빈에 대하여 (BeanDefinition + 스프링 빈 조회) (0) | 2024.03.12 |
| [Spring] IoC, DI와 스프링 컨테이너(Spring Container) (0) | 2024.03.12 |