티스토리 뷰
그렇다면 스프링은 어떻게 싱글톤 패턴을 유지하는 걸까?
스프링빈 설정 정보를 담은 AppConfig를 AnnotationConfigApplicationContext로 넘기면, AppConfig 또한 스프링 빈으로 등록된다. AppConfig 파일을 스프링 빈에서 꺼내서 출력해보면...
예상대로라면 클래스명이 AppConfig로 나와야하는데... $$EnhancerBySpringCGLIB이라는 게 추가된 클래스명이 나온다.
어떻게 된 일일까?
내가 AppConfig를 넘겨주면 스프링은 그것을 있는 그대로 스프링 빈으로 등록하지 않는다. CGLIB이라는 바이트코드 조작 라이브러리를 사용해서 AppConfig를 상속한 다른 클래스(AppConfig@CGLIB)를 만든다. 그리고 이 클래스를 스프링 컨테이너에 등록한다.
가공된 클래스인 AppConfig@CGLIB을 예상해보면 위와 같다. MemoryMemberRepository는 MemberRepository에 주입되는 하위객체이다. MemberRepository라는 객체를 스프링 빈으로 등록할 때, 하위 객체가 이미 등록되어 있다면 등록된 하위 객체를 찾아서 바로 반환한다. 등록하려던 객체 또한 바로 등록된다.
반면에 주입하려고 하는 객체가 아직 등록되지 않은 하위 객체라면 AppConfig에 있는 코드대로 수행해서 하위 객체를 먼저 등록한 뒤, 등록하려던 객체를 등록한다.
이처럼 어떤 객체를 생성하기 전에 등록 여부를 먼저 체크한다. 따라서 객체가 중복생성되지 않고 싱글톤 패턴을 유지하게 된다.
주의사항
위와 같이 CGLIB을 이용해서 싱글톤 패턴을 보장하려면, 스프링 설정 파일에 항상 @Configuration annotation을 붙여줘야한다. 만약 @Configuration을 붙이지 않으면, CGLIB이 사용되지 않아 객체가 중복생성되며, 스프링 컨테이너는 빈을 관리할 수 없게 된다.
스프링 설정 정보에는 항상 @Configuration 을 사용하자.
사진, 내용 출처 : 인프런, 김영한 강사님의 '스프링 핵심 원리 - 기본편' 강좌, 강의자료
'SPRING' 카테고리의 다른 글
컴포넌트 스캔 (0) | 2021.05.16 |
---|---|
EC2에서 SPRING APPLICATION이 돌아가지 않을 때 (FEAT. SWAP MEMORY) (0) | 2021.04.04 |
싱글톤 컨테이너 (1) 등장배경, 정의, 주의사항 (0) | 2021.01.21 |
의존관계 주입(DI, Dependency Injection), DI 컨테이너 (0) | 2021.01.18 |
제어의 역전(IoC) (0) | 2021.01.18 |
- Total
- Today
- Yesterday
- 메서드레퍼런스
- java
- 자바
- ec2
- OOP
- 코딩테스트
- 코테
- 카카오
- 프로그래머스
- 토비의봄TV
- gracefulshutdown
- 토비의스프링
- 자바스터디
- 템플릿콜백
- 데코레이터패턴
- 예외처리
- 객체지향
- BOJ
- c++
- 스프링
- 프록시
- AOP
- 프록시패턴
- 디자인패턴
- 김영한
- 토비
- 서비스추상화
- provider
- 백기선
- SOLID
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |