Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
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
Tags
more
Archives
Today
Total
관리 메뉴

백정탈의 개발 블로그

Spring-싱글톤 컨테이너 본문

스프링

Spring-싱글톤 컨테이너

백정탈 2023. 2. 27. 16:25

싱글톤 패턴

클래스의 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인 패턴, 이미 만들어진 객체를 공유해서 효율적으로 사용가능하다. 하지만 너무 많은 요청에 많이 공유시키면 다른 클래스들 간의 결합도가 높아지게 되는데, 이때 개방-폐쇄 원칙( OCP)이 위배된다. 

 

싱글톤 컨테이너

위의 단점을 극복하는 것이 싱글톤 컨테이너다.스프링 컨테이너가 싱글톤 컨테이너 역할을 하는데 하나의 객체만 생성해서 관리한다. 이렇게 싱글톤 객체를 생성하고 관리하는 기능을 싱글톤 레지스트리라 한다. DIP, OCP원칙을 지킨다.

 

주의점

하나의 객채를 공유하기 때문에 무상태(stateless)로 설계해야 한다. 특정 필드가 변경할수 있는 코드가 존재하면 안되고 가급적 읽기만 가능해야한다. 필드대신 지역변수,공유하지 않는 변수를 사용해야한다.

 

 

@Configuration과 싱글톤

@Configuration
public class AppConfig {
 @Bean
 public MemberService memberService() {
 return new MemberServiceImpl(memberRepository());
 }
 @Bean
 public OrderService orderService() {
 return new OrderServiceImpl(
 memberRepository(),
 discountPolicy());
 }
 @Bean
 public MemberRepository memberRepository() {
 return new MemoryMemberRepository();
 }
 ...
}

다른 2개의 MemoryMemberRepository가 생성되면 싱글톤이 깨지다고 생각 할수 있지만, @Configuration에서 적용된 AppConfig때문이다. 

@Test
void configurationDeep() {
 ApplicationContext ac = new
AnnotationConfigApplicationContext(AppConfig.class);
 //AppConfig도 스프링 빈으로 등록된다.
 AppConfig bean = ac.getBean(AppConfig.class);
 
 System.out.println("bean = " + bean.getClass());
}

테스트코드를 실행해서  AnnotationConfigApplicationContext로 넘긴 AppConfig.class 스프링 빈으로 등록된다.  하지만 AppConfig를 빈 클래스 정보를 조회 하면  

bean = class hello.core.AppConfig$$EnhancerBySpringCGLIB$$bd479d70

AppConfig뒤에 xxxxCGLIBxxxxxx가 붙는데 순수한 클래스 정보와 다르다. 이것은 스프링 바이트코드 조작 라이브러리를 사용해서 임의 다른 클래스를 만들어 스프링 빈에 등록한것이다. 이 스프링빈에 등록되 임의의 클래스가 자동으로 싱글톤을 보장하는것이다. 

'스프링' 카테고리의 다른 글

Spring-빈 생명주기 콜백  (0) 2023.03.08
Springs-의존관계 주입과 옵션처리  (0) 2023.03.03
Spring-컴포넌트 스캔  (0) 2023.03.01
spring-스프링 컨테이너와 스프링 빈  (0) 2023.02.27
Spring-DI  (0) 2023.02.22