일단 무조건 싱글톤이 안티 패턴이다! 이런건 아님.
기본적으로 패턴은 코드 양식 같은거임 선배 개발자의 산물
근데 여기서 패턴 양식은 흔히 FP, DOP 같은것들이 있지만
우리가 흔히 말하는 코드 패턴은 객체지향 원칙임. 그래서 OOP의 원칙을 지키는데
여기서 상속-다형성-추상화-캡슐화(은닉)
인데 이걸 풀어서 보통 SOLID라고함. 어쨌건 이 원칙 안지키면 안티패턴이야! 라고들 함.
근데 싱글톤의 경우 전역 접근점으로 흔히 쓰여서 어디서든 쉽게 싱글톤 인스턴스에 접근해서 상태 변경이 가능함
이건 유닛 테스트도 하기 어렵지만, 기본적으로
DIP(의존성 역전 원칙)
OCP(개방 폐쇄 원칙)
에 위배됨.
싱글톤은 구체적 클래스에 의해서만 만들어지기때문에 추상화에 의존해야하는 DIP를 위반해서 코드 확장을 어렵게함.
또한 '일반적'싱글톤은 Is-a 관계에 제한되어있기때문에 확장에 닫혀 있어서, 기능 추가를 위한 확장성에 불리함
따라서 싱글톤은 이러한 경향이 있어서 잘못쓰면 안티패턴이라고 할 수 있음
그럼 DIP를 보통 어떻게 극복하는가? 싱글톤에 대해서 외부 의존성 주입(DI)를 하면 해결 가능. 즉 DI 컨테이너로 해결함
즉 인스턴스가 단일로 존재해야만 한다는 속성은 유지하되, 가져오는 방식을 추상화해야함.
그리고 OCP도 싱글톤을 추상화하는 방식으로 구현하면됨. 그리고 이때 책임원칙(자신의 추상화 방식)에 따라서 단일 책임만 해주면
싱글톤도 충분히 패턴이 됨
쉽게 말하자면 싱글톤의 기능을 인터페이스로, 그리고 싱글톤은 인터페이스를 구현하도록하면됨.
하지만, 보통은 저걸 다 지키기 힘들기때문에 안티패턴이 될 확률이 높다고 하는거
실제로 대부분의 싱글톤 패턴은 안티패턴으로 만들어져 있음.
싱글톤을 인터페이스로?? 어렵네..
이 댓글은 게시물 작성자가 삭제하였습니다.
해석 : 싱글턴은 남발할수록 코드의 복잡성이 증가하기 때문에 유지 보수가 어려워진다