더북(TheBook)

4.4 정리하기

 

많은 아키텍트와 개발자들이 안티패턴으로 여길 정도까지 싱글톤 패턴이 총애를 잃게 된 내막을 간단히 살펴봤습니다. 싱글톤 패턴이 인기가 떨어진 건 이 패턴을 오남용했을 때의 문제점과 멀티스레드 애플리케이션에서 사용할 때 드러나는 단점 때문입니다.

싱글톤 패턴은 구현하기 편한 까닭에 개발자들의 오남용이 잦았습니다. 클래스를 죄다 싱글톤으로 만들어버린 거죠. 유지보수 담당자로서는 끔찍한 일입니다. 싱글톤 인스턴스가 여럿 필요한 상황에서는 객체 지향적으로 코드를 리팩터링한다는 것 자체가 꽤 부담스러운 일입니다.

싱글톤 클래스를 사용하면 간단한 단위 테스트를 하나 실행할 때에도 전역 상태값을 초기화해야 하는 탓에 테스트가 점점 어려워집니다. 게다가 이런 상태값이 계속 변하면 테스트 결괏값에도 영향이 있기 때문에 확장성이 떨어지는 테스트가 될 공산이 큽니다.

멀티스레드 환경에서 싱글톤을 쓰면 여러 가지 난관에 부딪히게 된다는 사실을 예제 코드를 보며 배웠습니다. 자바 SE 5에서 이늄 타입이 등장하기 전, 100% 스레드-안전한 싱글톤은 생성하기 어려웠습니다.

자바 EE가 발전을 거듭한 결과 @Singleton을 붙여 컨테이너에게 동시성을 제어하도록 맡길 수 있게 되면서 스레드-안전한 싱글톤 문제는 대부분 해결되었습니다.

컨테이너는 싱글톤 생성을 관장하면서 @PostContrust 완료 전에는 어떤 비즈니스 메서드도 호출하지 않도록 보장합니다. 또 @ConcurrencyManagement을 붙여 빈에 동시 접근하는 문제를 조정하고 이와 연관된 @LockType 애너테이션으로 각 메서드를 세세히 접근 통제합니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.