Hansel

싱글톤 패턴 본문

Spring/기초

싱글톤 패턴

핑슬 2022. 2. 4. 21:12

클래스 인스턴스가 딱 1개만 생성하는것을 보장하는 디자인 패턴

 

package hello.core.singleton;

public class SingletonService {

    private static final SingletonService instance = new SingletonService();
    //자기 자신을 가진다. 스태틱으로 => 단 1개만 존재하게 된다.
    //스태틱 영역에서 미리 생성해둔다.


    //조회시 사용
    public static SingletonService getInstance(){
        return instance;
        //항상 같은 인스턴스 반환함
    }

    //프라이빗 생성자
    //외부에서 생성을 막는다. 프라이빗 생성자
    private SingletonService(){

    }

    public void logic(){
        System.out.println("싱글톤 객체 로직 호출");
    }
}

일반적인 객체 생성 방법을 사용하면 사용자 조회 때 마다 객체를 생성해서 공간 낭비나 속도 저하의 원인이 될 수 있다.

하지만 싱글톤 패턴을 사용하면 하나의 객체를 공유해서 그러한 문제점을 해결할 수 있다.

싱글톤 패턴은 위의 코드와 같이 클래스 내에 자기 자신을 가지는 필드를 만들고 getInstance를 통해 해당 객체를 확인하도록 한다.

그리고 생성자를 private으로 만들어 외부에서 객체를 생성하지 못하도록 차단한다.

 

@Test
    @DisplayName("싱글톤 패턴 적용한 객체 사용")
    void singletonServiceTest(){
        SingletonService instance1 = SingletonService.getInstance();
        SingletonService instance2 = SingletonService.getInstance();

        Assertions.assertThat(instance1).isSameAs(instance2);
    }

    //자식 만들기 어려움, DIP,OCP 위반, 유연성 떨어짐, 내부 속성 변경 혹은 초기화 어려움

테스트를 해봤을때 instance1 & instance2는 동일한 객체임을 확인할 수 있다.

하지만 싱글톤 패턴만으로는 다양한 문제점이 있다.

싱글톤 컨테이너는 그 문제점을 해결해준다.