본문 바로가기
Java

[디자인 패턴] 싱글톤 패턴

by foreverever 2021. 9. 19.
반응형

개념

인스턴스를 오직 하나만 생성하여 사용하는 패턴

장점

  • 오직 한개의 인스턴스만 메모리에 저장되므로 메모리 효율적임
  • 멀티 스레드 환경에서 여러 요청에 대한 처리가 필요할때 효율적임
  • 스프링 컨테이너에서 빈(객체)들을 싱글톤으로 관리

단점

  • 코드 자체가 늘어난다.
  • 잘못된 방식의 구현은 멀티 스레드 환경에서 '동시성' 문제 즉 스레드 언세이프 이슈가 발생할 수 있다.
  • private 생성자로 인한 상속 불가
  • 테스트 어려움 (mock 객체 생성 불가 -> static 메서드나 생성자는 mockito로는 mocking이 불가능)

주의사항

  • 딱 1개의 인스턴스만 존재해야하므로, 생성자를 private으로 하여 외부에서 new 키워드로 인스턴스 생성을 방지하도록 한다.
  • 싱글톤 객체는 상태를 무상태(stateless)로 설계해야 한다.
    • 특정 클라이언트에 의존적인 필드가 없어야 한다.
    • 특정 클라이언트가 값을 변경할 수 있는 필드가 없어야 한다.
    • 읽기만 가능해야 한다.

싱글톤 구현

1) pubilc 필드방식

public class Singleton {
    public static final Singleton INSTANCE = new Singleton();

    private Singleton() {}

    /* method */
    ...
}

2) 정적 팩터리 방식

public class Singleton {
    private static final Singleton INSTANCE = new Singleton();

    private Singleton() {}

    public static Singleton getInstance() {
        return INSTANCE;
    }

    /* method */
    ...
}

3) 원소가 하나인 열거 타입 방식 (enum 자체가 스레드 세이프 보장)

public enum Singleton {
    INSTANCE; 

    /* method */
    ...
}

4) 위험한 방식 (스레드 언세이프)

public class {
    private static Singleton instance;

    private Singleton() {}

    public static Singleton getInstance() {
        if(instance == null) {  //멀티 스레드 환경에서 여러 스레드가 동시 접근 시 문제 발생
            instance = new Singleton();
        }
        return instance;
    }
}
반응형