스프링 컨테이너는 정말 싱글톤일까?

woply·2022년 1월 18일
0

TIL(Today I Learn)

목록 보기
15/31

📖 ✏️

  1. TIL 시리즈에 작성된 글은 '매일 매일 학습한 지식 조각을 메모해 놓은 포스팅'입니다. 공유가 아닌 개인적인 학습 내용 기록을 목적으로 작성되었음을 알려드립니다.
  2. 그 외 시리즈에 작성된 공유 목적의 포스팅은 시간이 날 때마다 별도로 작성하고 있습니다. 주로, TIL 시리즈에 작성된 내용에서 특정 주제를 선정하고, 더 깊이 공부한 후 정리하여 작성합니다.

스프링 컨테이너는 정말 싱글톤일까?

스프링 컨테이너는 등록된 Bean 객체를 싱글톤으로 관리한다. 여러 클라이언트가 동시에 객체를 조회하여도 단 하나의 객체가 공유된다.

스프링 컨테이너는 기본적으로 싱글톤을 적용하고 있기 때문에 별도의 설정이 필요하지 않다. 스프링 컨테이너가 싱글톤 객체를 생성하고 관리하는 기능을 싱글톤 레지스트리라고 한다.

스프링 Bean이 싱글톤으로 관리되고 있는지 확인해보려면 getBean()를 이용해 볼 수 있다. 컨테이너에 등록된 객체를 여러개 호출하여 동일한 객체인지 확인해보자.

스프링 컨테이너 생성 후 getBean()을 이용하여 객체를 생성한다. 생성된 두 객체의 참조값 비교를 통해 동일한 객체임을 확인할 수 있다.

@Test
@DisplayName("스프링 컨테이너와 싱글톤")
void springContainer() {
    // AppConfig appConfig = new AppConfig();
    ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
    
    // 1. getBean()을 이용한 MemberService 객체 호출
    MemberService memberService1 = ac.getBean("memberService",MemberService.class);

    // 2. getBean()을 이용한 MemberService 객체 호출
    MemberService memberService2 = ac.getBean("memberService",MemberService.class);

    // 참조값이 동일한지 확인
    System.out.println("memberService1 = " + memberService1);
    System.out.println("memberService2 = " + memberService2);

    // memverService1 == memberService2
    assertThat(memberService1).isSameAs(memberService2);
}

테스트 결과

테스트 패스와 함께 참조값이 동일함을 확인할 수 있다.

테스트 패스와 함께 참조값이 동일한 객체임을 확인할 수 있다.

참고
스프링의 기본 빈 등록 방식은 싱글톤이지만, 싱글톤 방식만 지원하는 것은 아니다. 요청할 때 마다 새로운 객체를 생성해서 반환하는 기능도 제공한다. 또는 HTTP 리퀘스트 라이프사이클에 맞춰서 객체를 생성하거나, 고객의 활성 상태를 따르는 사이클, 세션을 따르는 사이클 등 다영한 세부 설정이 가능하다. 하지만, 대부분의 경우 싱글톤 패턴을 사용한다.


요약

스프링을 이용한 싱글톤 컨테이너 방식이 적용되면 클라이언트의 요청이 발생할 때 마다, 동일한 객체를 반환한다. 스프링 컨테이너의 도움으로 고객의 요청이 올 때 마다 객체를 생성하지 않고, 이미 만들어진 객체를 공유해서 효율적으로 재사용한다.

profile
7년간 마케터로 일했고, 현재는 헤렌에서 백엔드 개발자로 일하고 있습니다. 고객 가치를 설계하는 개발자를 지향하며, 개발, 독서, 글쓰기를 좋아합니다. 업이 심오한 놀이이길 바라는 덕업일치 주의자입니다.

0개의 댓글