디자인 패턴 - Singleton Pattern

bp.chys·2020년 6월 8일
0

OOP & Design Pattern

목록 보기
15/17

싱글톤 패턴

  • 애플리케이션 구동 중 클래스의 인스턴스를 단 한 개만 생성하고 사용하는 디자인 패턴
  • 객체에 메모리를 최초 한번만 할당한다.
  • 싱글톤 인스턴스는 전역 변수 처럼 사용할 수 있다.
  • 모든 생성자는 private이어야 한다.

싱글톤 패턴 장단점

장점

  • 객체를 여러번 생성할 필요가 없고, 기존에 생성된 것을 가져다 쓰기 때문에 메모리와 성능 측면에서 효율이 좋다.
  • 도메인 상에서 인스턴스가 절대적으로 한개만 존재하는 것을 보증할 수 있다.

단점

  • 싱글톤을 구현하는 코드가 많이 들어간다. (thread-safe 고려)
  • 클래스 내부에서 객체를 직접 생성하기 때문에 객체 지향 설계원칙인 OCP, DIP를 위배한다.
  • 테스트가 어렵다.

예시

1. 메소드로 접근 : getInstance()

  • 애플리케이션 구동 시 인스턴스가 생성되는 것이 아닌, 객체가 실제로 필요한 시점까지 생성을 지연시킬 수 있다.
  • 멀티스레드 환경에서 스레드 안전하게 구현하려면 synchronized 키워드를 통해 동기화를 시켜줘야한다.
  • 그러나 동기화는 성능을 저하시키는 단점이 있다.
public class Singleton {
    private static Singleton singleton;
    
    private Singleton() {}
    
    public static synchroinzed Singleton getInstance() {
        if (singleton == null) {
            this.singleton = new Singleton();
        }
        return this.singleton;
    }
}

2. 변수로 접근 : static final

  • 애플리케이션 구동 시 인스턴스를 즉시 생성한다.
  • static final 키워드를 통해 불변 객체를 보장한다.
  • 구현이 단순하여 대체로 많이 쓰이는 싱글톤 패턴 방식이다.
public class Singleton {
    public static final Singleton singleton = new Singleton();
    
    private Singleton() {};
    
    ...
}

SOLID 관점에서 본 싱글톤 패턴

  • 단일 책임 원칙 : 구현과 사용 책임이 하나의 클래스에 몰려있다. 엄밀히 따지면 단일 책임 원칙을 위배하고 있다.
  • 개방 폐쇄 원칙 : 클래스 내부에서 객체를 직접 생성하고 사용하고 있다. 싱글톤 기능의 확장으로 다른 객체를 사용할 경우 코드가 변경되어야하므로 개방 폐쇄 원칙도 위배된다.
  • 의존성 역전 원칙 : 추상화에 의존하지 않고 직접 구현체와 결합하고 있으므로 의존성 역전 원칙도 따르지 않고 있다.

결론

싱글톤 패턴은 애플리케이션 실행 중 인스턴스를 한 개만 생성하고 싶을 때 사용하는 디자인 패턴이다. 싱글톤 패턴은 장단점이 명확히 구분되기도 하지만, 프레임워크 도움없이 사용하게 될 경우 단점 때문에 오히려 안티패턴으로 간주되기도 한다. SOLID 관점에서 보더라도 여러 원칙들을 위배하기 때문에 객체지향스럽지 못한 패턴이기도 한다.

스프링 같은 프레임워크의 도움을 받는다면, 객체를 직접 생성할 필요없이 프레임워크가 단점을 커버해주는 부분이 많으므로 싱글톤 패턴의 장점을 누릴 수 있다. 그래서 스프링이 관리하는 빈들은 기본 스코프가 싱글톤으로 되어있다.

싱글톤 패턴 역시 자주 만나게 되는 디자인 패턴이다. 장단점을 명확히 알고 상황에 맞게 사용한다면 유용한 디자인 패턴이 될 수 있을 것이라고 생각한다.


참고자료

  • 개발자가 반드시 정복해야 할 객체 지향과 디자인 패턴 - 최범균
profile
하루에 한걸음씩, 꾸준히

0개의 댓글