Singleton Abuse

  • 싱글톤 패턴을 잘못 사용하거나 남용하는 경우를 의미한다.
  • 애플리케이션의 요구 사항이나 사용 사례를 고려하지 않고 무분별하게 적용하는 경우를 의미한다.
  • 일반적으로 필요하지 않거나 적절하지 않은 상황에서 싱글톤 패턴을 사용하여 코드베이스에 불필요한 복잡성, 긴밀한 결합 및 기타 부정적인 결과를 초래하는 것을 포함

특징

  1. 글로벌 상태
  • 전역 상태를 만들어서 변경 추적을 어렵게 한다.
  • 이 과정에서 예기치 않은 동작, 버그를 발생할 수 있다.
  1. 긴밀한 결합
  • 싱글톤에 의존하는 클래스는 긴밀하게 결합되어 코드를 테스트하거나 리팩토링하기 어렵게 만든다.
  1. 동시성 문제
  • 공유 인스턴스이므로 멀티쓰레드 환경에서 동시성 이슈에 자유롭지 않다.
  1. 숨겨진 종속성
  • 종속성을 숨기므로 클래스의 동작이나 다른 컴포넌트와의 상호 작용을 이해하기 어렵다.
  1. 테스트의 어려움
  • mocking 하기 어렵게 한다.

단점

  1. 확장성 문제
  2. 유지 관리 부담
  3. 코드 재사용의 어려움
  4. 코드 냄새

예시

class DatabaseConnection {
    private static DatabaseConnection instance;
    
    private DatabaseConnection () {
        
    }
    
    public static synchronized DatabaseConnection getInstance() {
        if( instance == null ) instance = new DatabaseConnection();
        
        return instance;
    }
}

해결

1. 의존성 중깁 사용

  • 싱글통에 의존하는 대신 의존서 주입을 사용해서 종속성이 필요한 클래스에 명시적으로 종속성을 전달

    2. 불변성 선호

  • 변경 가능한 싱글톤보다 변경 불가능한 객체를 선호하여 공유 상태 및 동시성을 제거

    3. Thread-safe를 고려

  • 쓰레드에 안전하게 구현하거나 동기화 메커니즘을 사용

    4. 종속성 캡슐화

  • 싱글톤 인스턴스를 다른 클래스에 직접 노출하지 말고 인터페이스 뒤에 종속성을 캡슐화

    5. SOLID 원칙 준수

  • SRP, DIP를 준수해서 응집성 있고 재사용 가능하며 느슨하게 결합된 클래스를 만들어보자