Singleton Abuse
- 싱글톤 패턴을 잘못 사용하거나 남용하는 경우를 의미한다.
- 애플리케이션의 요구 사항이나 사용 사례를 고려하지 않고 무분별하게 적용하는 경우를 의미한다.
- 일반적으로 필요하지 않거나 적절하지 않은 상황에서 싱글톤 패턴을 사용하여 코드베이스에 불필요한 복잡성, 긴밀한 결합 및 기타 부정적인 결과를 초래하는 것을 포함
특징
- 글로벌 상태
- 전역 상태를 만들어서 변경 추적을 어렵게 한다.
- 이 과정에서 예기치 않은 동작, 버그를 발생할 수 있다.
- 긴밀한 결합
- 싱글톤에 의존하는 클래스는 긴밀하게 결합되어 코드를 테스트하거나 리팩토링하기 어렵게 만든다.
- 동시성 문제
- 공유 인스턴스이므로 멀티쓰레드 환경에서 동시성 이슈에 자유롭지 않다.
- 숨겨진 종속성
- 종속성을 숨기므로 클래스의 동작이나 다른 컴포넌트와의 상호 작용을 이해하기 어렵다.
- 테스트의 어려움
- mocking 하기 어렵게 한다.
단점
- 확장성 문제
- 유지 관리 부담
- 코드 재사용의 어려움
- 코드 냄새
예시
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를 준수해서 응집성 있고 재사용 가능하며 느슨하게 결합된 클래스를 만들어보자