TIL/스프링 핵심원리 - 기본편 with 인프런(김영한님)

스프링 핵심원리 기본편12 - 웹 애플리케이션과 싱글톤, 싱글톤 패턴

JJONGSTORY 2024. 8. 5. 12:17
반응형

안녕하세요 오늘은 웹 애플리케이션과 싱글톤 강의를 정리해 보겠습니다.

 

싱글톤은 객체 인스턴스가 하나만 있어야 하는 패턴을 말합니다

보통 웹은 여러 고객이 동시에 요청을 하고 고객이 요청이 올 때마다 객체를 만들어야 합니다.

그렇다면 서비스를 호출하여도 참조값이 다르게 됩니다. 즉 jvm 메모리에 계속 객체가 생생되어 올라갑니다.

 

예시를 보여드리겠습니다.

1
2
3
4
5
        MemberService memberService1 = appconfig.memberService();
        MemberService memberService2 = appconfig.memberService();
        
        System.out.println("memberService1 = " + memberService1);
        System.out.println("memberService2 = " + memberService2);
cs

위 소스를 수행시킨다면 

서로 다른 개의 객체가 생성되는것을 볼 수 있습니다.

 

웹애플리케이션은 고객의 요청이 많은데 그렇다면 객체를 엄청나게 많이 생성해 주어야 합니다.

그렇다면 메모리 낭비가 엄청나게 많이 생기게 됩니다.

 

해결을 위해서는 객체는 하나만 생성하고 생성된 객체를 공유하여 생성하면 됩니다.

싱글톤패턴이 이러한 문제를 해결해 줄 수 있습니다.

 

싱글톤 패턴

싱글톤 패턴은 클레스의 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인 패턴입니다.

객체 인스턴스를 2개 이상 생성하지 못하도록 하기 위해 private 생성자를 사용 외부에서 임의로 new 키워드를 사용하지 못하도록 막아야 합니다.

 

1
2
3
4
5
6
7
8
9
    private static final SingletonService instance = new SingletonService();
    
    public static SingletonService getInstance() {
        return instance;
    }
    
    private SingletonService() {
        
    }
cs

 

위와 같이 private로 만들어 준 다음 외부에서 호출해 준다면 private access로 에러가 발생하게 됩니다.

이 객체의 인스턴스가 필요하다면 오직 getInstance() 메서드를 통해서만 생성할 수 있습니다.

해당 메서드는 항상 같은 인스턴스를 반환 합니다.

 

테스트를 하기 위해 getInstance()를 이용하여 생성해 주는 소스는 아래와 같고 아래의 소스를 돌려보면 같은 객체 인스턴스를 반환합니다.

 

1
2
3
4
5
6
7
8
        @Test
        @DisplayName("싱글톤 패턴을 적용한 객체 사용")
        void singletonServiceTest() {
            SingletonService singletonService1 = SingletonService.getInstance();
            SingletonService singletonService2 = SingletonService.getInstance();
            System.out.println("singletonService1 = " + singletonService1);
            System.out.println("singletonService2 = " + singletonService2);
        }
cs

 

싱글톤 패턴은 유용하지만 문제점도 가지고 있습니다.

1. 구현을 위한 코드가 많이 들어갑니다.

2. 의존관계 문제가 있습니다. 클라이언트가 구체 클래스에 의존합니다. dip 위반

3. 클라이언트가 구체 클래스를 의존하기 때문에 ocp 위반 가능성이 크다.

4. private 생성자를 사용하여 자식 클래스를 만들기 힘들다.

5. 내부 속성을 변경하거나 초기화하기 어렵다.

 

스프링 컨테이너 사용 시 스프링 컨테이너가 알아서 객체를 모두 싱글톤으로 만들어서 관리해 줍니다.

스프링 컨테이너의 싱글톤 컨테이너는 싱글톤의 장점은 다 가져오고 단점은 모두 제거하면서 객체는 싱글톤으로 관리해 줍니다.

 

다음시간엔 스프링 컨테이너에서의 싱글톤을 공부해 보겠습니다.

반응형