희디비
[Spring] 싱글톤 컨테이너 본문
💡 싱글톤 패턴 이란?
객체를 하나만 생성 하여 관리 하는 패턴을 말한다.
객체의 생성을 private 생성자를 통해 막고, getInstance()를 통해 객체의 참조를 얻을 수 있다.
🙄 싱글톤 사용 이유
웹 어플리케이션의 경우 사용자의 요청이 매우 많다.
사용자가 요청 할때 마다 객체를 생성하게 되면 리소스가 낭비 되기 때문이다.
🤔 자바로 싱글톤을 구현시 문제점
자바만을 사용해 모든 객체를 싱글톤 패턴으로 만들게 되면 문제가 있다.
1. 싱글톤 객체.getInstance()를 통해 DI -> 구체 클래스에 의존하게 되어 OCP, DIP를 위반한다.
2. 객체 마다 싱글톤 코드를 추가 해야한다.
3. private 생성자를 이용할 경우 자식 클래스의 생성이 어렵다.
위 설정 클래스를 통해 객체를 가져오면 싱글톤이 보장 되지 않는다.
memberService() -> memberRepository() -> new MemoryMemberRepository() 호출
orderService() -> memberRepository() -> new MemoryMemberRepository() 호출
자바만으론 싱글톤을 보장 하기 어렵다.
❓ 스프링은 어떻게 자바 코드를 싱글톤을 보장할까?
@Configuration
스프링은 위 경우 처럼 수동 빈 등록을 할 경우에 바이트 조작 라이브러리를 사용한다.
설정정보에 @Configuration를 작성 하고 테스트 코드를 돌려보자
스프링은 CGLIB 라이브러리를 통해 싱글톤을 보장한다.
1. AppConfig를 상속받는 CGLIB 클래스를 만든다.
2. 빈을 등록할 때 컨테이너에 있는 빈이라면 재사용 한다.
( 스프링 컨테이너에 자기 자신을 등록하는데 부모타입인 AppConfig로 조회하여 보이는 것이다.)
위 내용은 김영한님 스프링 핵심 원리 - 기본편을 참고하여 만들었습니다.
요약 한 내용이므로 자세한 내용은 강의 를 보시는 것을 추천합니다!
'Spring' 카테고리의 다른 글
[Spring] @ExceptionHandler API 에러 핸들링 (3) | 2024.09.06 |
---|---|
[Spring] 필터, 인터셉터 (Interceptor) (0) | 2024.09.05 |
[Spring] 쿠키, 세션 (Cookie, Session) (0) | 2024.09.04 |
[Spring] 빈 검증 ( Bean Validation ) (0) | 2024.09.03 |
[Spring] 메시지, 검증 (Validation) (4) | 2024.09.02 |