싱글톤 패턴
싱글톤
싱글톤 패턴은 특정 클래스의 인스턴스가 딱 하나만 생성되어야 할 때 사용된다.
전역에서 이 인스턴스가 하나만 있어야 할 때에 이에 접근하기 위한 지점을 제공하는 디자인 패턴이다.
객체가 반복적으로 생성하는 걸 방지하여 메모리를 효율적으로 관리하기 위해 사용된다.
싱글톤 패턴 사용 예시
-
공통으로 사용되어야 하는 객체
-
설정 정보와 같이 런타임 내에서 공유돼야 하는 정보
-
로그를 기록하는 객체
-
하드웨어 지원에 대한 접근을 관리해야하는 경우
싱글톤 사용의 문제점
- 객체지향 설계 원칙 위반
- SRP 위반 : 싱글톤은 그 클래스가 여러 책임을 가지고 있기 때문에 단일 책임 원칙을 위반
- OCP 위반 : 싱글톤은 구체 클래스에 의존하기 때문에 OCP 원칙을 위반할 가능성이 높음
- DIP 위반 : 역시 구체 클래스에 의존하기 때문에 추상화에 의존해야한다는 DIP 원칙을 위반
- 테스트가 어려움
- 싱글톤 인스턴스는 전역으로 사용되기 때문에 단위 테스트를 실행할 때 영향을 끼칠 수 있음
- 싱글톤 인스턴스는 대체되기 어려움
- 멀티스레드에서의 문제
- 여러 스레드가 동시에 싱글톤 인스턴스에 접근 시, 인스턴스가 여러 번 생성될 가능성이 있음
- 위를 해결하기 위해 동기화를 하는 경우, 성능이 저하될 수 있음
- 기타
- 싱글톤 인스턴스로 인해 클래스 간의 의존성(결합도)이 높아질 수 있음 -> 유연성, 확장성 떨어짐
- 생성자가 private으로 제한되어 있어 상속으로 자식 클래스를 생성하기 어려움
- 싱글톤 인스턴스의 생명 주기가 제어하기 어려움
해결방안
- 의존성 주입 : 싱글톤 객체를 직접 생성하는 것이 아닌 필요한 곳에만 주입해주는 것
- Stateless 싱글톤 객체 : 상태가 없는 형태로 싱글톤 객체를 설계하여 전역 상태 관리 문제를 줄임
- 인터페이스 : 싱글톤 객체가 구체 클래스에 강한 결합도를 가지지 않도록 인터페이스를 통한 접근