[Spring] 싱글톤 컨테이너

싱글톤 컨테이너에 대해 알아보자.


스프링 컨테이너는 싱글톤 패턴의 문제점을 해결하면서, 객체 인스턴스를 싱글톤(1개만 생성)으로 관리한다. 지금까지 우리가 학습한 스프링 빈이 싱글톤으로 관리되는 빈이다. 

싱글톤 컨테이너

스프링 컨테이너는 싱글톤 패턴을 적용하지 않아도, 객체 인스턴스를 싱글톤으로 관리한다. 이전에 설명한 컨테이너 생성 과정을 보면 컨테이너 객체를 하나만 생성해서 관리한다.

즉, 스프링 컨테이너는 싱글톤 컨테이너 역할을 하는 것이다. 이렇게 싱글톤 객체를 생성하고 관리하는 기능싱글톤 레지스트리라고 한다. 

스프링 컨테이너의 이런 기능 덕분에 싱글톤 패턴의 모든 단점을 해결하면서 객체를 싱글톤으로 유지할 수 있다. 

 

다음과 같은 테스트코드를 작성해 직접 확인해보자. 

@Test
    @DisplayName("스프링 컨테이너와 싱글톤")
    void springContainer(){
        ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);

        MemberService memberService1 = ac.getBean("memberService", MemberService.class);
        MemberService memberService2 = ac.getBean("memberService", MemberService.class);
        //참조값이 다른 것을 확인
        System.out.println("memberService1 = " + memberService1);
        System.out.println("memberService2 = " + memberService2);

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

 결과를 확인해보면 다음과 같다.

두 인스턴스가 같은 것을 확인할 수 있다 .

 

싱글톤 컨테이너를 적용하고 나면 다음 그림과 같이 된다.

클라이언트 A, B, C가 올 때마다 동일한 service를 반환해준다. 

즉, 이 스프링 컨테이너 덕분에 고객의 요청이 올 때마다 객체를 생성하는 것이 아니라, 이미 만들어진 객체를 공유해서 효율적으로 재사용할 수 있다


이런 싱글톤 방식에도 주의할 점이 있는데, 다음 포스팅에서 확인해보자.