싱글톤 패턴


싱글톤


싱글톤 패턴은 특정 클래스의 인스턴스가 딱 하나만 생성되어야 할 때 사용된다.

전역에서 이 인스턴스가 하나만 있어야 할 때에 이에 접근하기 위한 지점을 제공하는 디자인 패턴이다.

객체가 반복적으로 생성하는 걸 방지하여 메모리를 효율적으로 관리하기 위해 사용된다.


싱글톤 패턴 사용 예시


  • 공통으로 사용되어야 하는 객체

  • 설정 정보와 같이 런타임 내에서 공유돼야 하는 정보

  • 로그를 기록하는 객체

  • 하드웨어 지원에 대한 접근을 관리해야하는 경우


싱글톤 사용의 문제점


  • 객체지향 설계 원칙 위반
    • SRP 위반 : 싱글톤은 그 클래스가 여러 책임을 가지고 있기 때문에 단일 책임 원칙을 위반
    • OCP 위반 : 싱글톤은 구체 클래스에 의존하기 때문에 OCP 원칙을 위반할 가능성이 높음
    • DIP 위반 : 역시 구체 클래스에 의존하기 때문에 추상화에 의존해야한다는 DIP 원칙을 위반
  • 테스트가 어려움
    • 싱글톤 인스턴스는 전역으로 사용되기 때문에 단위 테스트를 실행할 때 영향을 끼칠 수 있음
    • 싱글톤 인스턴스는 대체되기 어려움
  • 멀티스레드에서의 문제
    • 여러 스레드가 동시에 싱글톤 인스턴스에 접근 시, 인스턴스가 여러 번 생성될 가능성이 있음
    • 위를 해결하기 위해 동기화를 하는 경우, 성능이 저하될 수 있음
  • 기타
    • 싱글톤 인스턴스로 인해 클래스 간의 의존성(결합도)이 높아질 수 있음 -> 유연성, 확장성 떨어짐
    • 생성자가 private으로 제한되어 있어 상속으로 자식 클래스를 생성하기 어려움
    • 싱글톤 인스턴스의 생명 주기가 제어하기 어려움


해결방안


  • 의존성 주입 : 싱글톤 객체를 직접 생성하는 것이 아닌 필요한 곳에만 주입해주는 것
  • Stateless 싱글톤 객체 : 상태가 없는 형태로 싱글톤 객체를 설계하여 전역 상태 관리 문제를 줄임
  • 인터페이스 : 싱글톤 객체가 구체 클래스에 강한 결합도를 가지지 않도록 인터페이스를 통한 접근