본문 바로가기
김영한님 인강듣고/스프링 핵심원리-기본

코드 복습( 섹션 5 )

by doriver 2024. 2. 22.

섹션 5. 싱글톤 컨테이너

 

1. 싱글톤 패턴

클래스A 안에 
생성자에 private 붙임
A의 인스턴스를 private static final로 선언함
위에서 생성한 인스턴스를 반환하는 public static 메소드

 

생성자에 private가 붙어있어서, 외부에서 new A(); 로 생성 안됨
A의 인스턴스는 private static final로 1개 생성되있음
A의 인스턴스가 필요하면 public static메소드를 이용해서 얻음

>> A의 생성을 막아놓고, 인스턴스A를 1개 만들어 놓고,  A가 필요하면 메소드로 가따씀

2. 싱글톤 컨테이너

스프링 컨테이너에 등록된 객체는 여러번 호출( getBean )해도 동일하다
스프링 컨테이너는 스프링빈( 객체 인스턴스 )를 싱글톤( 1개만 생성 )으로 관리한다 

3. 싱글톤 방식의 주의점

스프링 빈으로 사용되는 StatefulService에서 price 필드는 공유되는 필드인데, 클라이언트가 값을 변경할수 있고
이것때문에 뒤죽 박죽 섞여버림

4. @Configuration( 바이트코드 조작 ) 그리고 싱글톤

@Configuration 이 있으면 

"call AppConfig.memberRepository" 는 1번만 출력됨

memberService(), memberRepository(), orderService()
위 3개 에서 생성된 MemoryMemberRepository는 모두 같은 객체 인스턴스로, 공유되어 사용됨

등록된 AppConfig 빈은
순수한 클래스 hello.core.AppConfig 가 아니라
hello.core.AppConfig$$EnhancerBySpringCGLIB$$bd479d70 이다
CGLIB( 바이트코드 조작 라이브러리 )에 의해 조작된, 클래스AppConfig를 상속받은 어떠한 다른 클래스 

@Configuration 없애면

@Bean만 사용해도 스프링 빈으로 등록은 되지만

"call AppConfig.memberRepository" 3번 출력됨

 

생성된 3개의 MemoryMemberRepository인스턴스는 모두 다름

hello.core.AppConfig 그냥 일반 클래스 정직하게 나옴

memberService() 에서 생성된  MemoryMemberRepository는 
스프링 빈이 아님, 스프링 컨테이너가 관리하지 않음. 
그냥 쌩 자바로 new MemoryMemberRepository(); 해준거랑 똑같음.