정리자: 이태혁 (Lee, TaeHyuk)

[Section4 - 싱글톤 컨테이너]


4-1) 웹 애플리케이션과 싱글톤

웹 애플리케이션의 중요한 특징중 하나는 보통 여러 고객이 동시에 요청한다는 사실이다.

[만약 싱글톤이 아니라면]

싱글톤 ㄴ.JPG

여러 고객이 memeberService를 요청할때마다 위와 같이 AppConfig에서 새로운 객체를 계속해서 생성할 것이다. (여러 고객이 동시에 요청하는 것이 웹 애플리케이션 특징)

public class SingletonTest {

    @Test
    @DisplayName("스프링 없는 순수한 DI 컨테이너")
    void pureContainer(){
        AppConfig appConfig = new AppConfig();
        //1. 조회: 호출할 때 마다 객체를 생성
        MemberService memberService1 = appConfig.memberService();

        //2. 조회: 호출할 때 마다 객체를 생성
        MemberService memberSerivce2 = appConfig.memberService();

        //참조값이 다른 것을 확인
        System.out.println("memberService1 = " + memberService1);
        System.out.println("memberService1 = " + memberSerivce2);

        //memberService1 != memberService2
        Assertions.assertThat(memberService1).isNotSameAs(memberSerivce2);
    }
}
//Result
memberService1 = hello.core.member.MemberServiceImpl@c0c2f8d
memberService1 = hello.core.member.MemberServiceImpl@305b7c14

만약 위와 같이 스프링 없이 순수 자바만으로 구현하면 MemberService를 부를때마다 위의 결과와 같이 새로 객체가 생성되는 것을 확인할수 있을 것이다 . (새로운 주소)

이것으로 예를 들자면, 초당 5만건의 요청이 들어오는 것인데, 순수 자바로 AppConfig를 구현했다면, 초당 5만개의 객체를 생성하고 메모리에서 소멸시키게 되는 것이다. (실제로는 내부에 있는 MemberRepository 등 더 많은 객체가 생성)

→ 이런 메모리 낭비를 줄일수 있는 해결방안은 해당 객체가 딱 1개만 생성되고, 공유하도록 설계하면 된다. 이것이 싱글톤 패턴이다.

(하지만, 요즘 컴퓨터 사양이 너무 좋아서 100~1000TPS 이런거로는 순수 자바로 짜도 끄덕 없긴 함)