Singleton 디자인 패턴의 문제점과 과다 사용에 대한 고찰

Singleton (싱글톤) 디자인 패턴은 소프트웨어 엔지니어링에서 오랜전부터 널리 사용되어 온 패턴 중 하나입니다. 이 패턴의 주된 목적은 클래스의 인스턴스가 하나만 생성되고, 어디서든 이 인스턴스에 접근할 수 있도록 하는 것입니다. 이는 특정 객체가 공유 자원으로 작동하거나 전역 상태를 관리해야 할 때 유용할 수 있습니다. 하지만, 싱글톤 패턴은 그 사용이 과도하게 이루어질 경우 여러 가지 문제를 야기할 수 있습니다.


싱글톤의 문제점


테스트의 어려움

싱글톤 인스턴스는 전역 상태를 갖기 때문에 테스트 환경에서 이를 초기화하거나 Mock 객체로 대체하기 어렵습니다. 이는 테스트를 복잡하게 만들며, 종종 코드 테스트의 완전성을 저해합니다.


코드의 결합도 증가

싱글톤 패턴은 다른 코드 부분들과의 높은 숨겨진 결합도를 초래할 수 있습니다. 이로 인해 시스템의 다른 부분들이 싱글톤에 의존하게 되며, 변경 사항이 전파되어 시스템 전체의 유지보수가 어려워질 수 있습니다.


멀티스레드 환경에서의 동기화 문제

멀티스레드 환경에서 싱글톤 인스턴스의 생성은 동기화 처리가 필요합니다. 이 과정에서 잘못된 구현은 성능 저하를 일으키거나 더 심각한 동시성 이슈를 발생시킬 수 있습니다.


싱글톤 사용의 적절한 예

싱글톤 패턴이 적합한 예로는 애플리케이션의 설정 정보를 관리하는 클래스를 들 수 있습니다. 설정 정보는 애플리케이션 전반에 걸쳐 일관되게 유지되어야 하며, 여러 컴포넌트에서 공통적으로 사용됩니다. 이러한 특성으로 인해 싱글톤 패턴이 유용하게 적용될 수 있습니다.


싱글톤 사용을 피해야 하는 경우

로그 생성기와 같이 상태를 내부적으로 저장하고 여러 부분에서 다르게 활용될 수 있는 객체는 싱글톤으로 관리되어서는 안 됩니다. 이 경우 싱글톤 사용은 로그의 상태 관리를 어렵게 하고, 다양한 환경에서의 유연한 로깅을 방해할 수 있습니다.


대안 패턴

싱글톤의 대안으로 다음과 같은 패턴들을 고려할 수 있습니다.


Dependency Injection (DI - 의존성 주입)

객체를 직접 생성하지 않고, 생성자나 세터를 통해 주입받는 방식입니다. 이를 통해 객체의 생성과 사용을 분리하고, 테스트 용이성과 코드의 유연성을 높일 수 있습니다.

SIDENOTE: 필드 인젝션을 피해야 하는 이유 – (자바 필드 인젝션의 함정: 견고한 코드로 가는 길: https://careerly.co.kr/comments/96671).


Service Locator (서비스 로케이터)

서비스 로케이터 패턴은 점점 구식으로 여겨지고 있지만 여전히 레거시 시스템에서 자주 발견됩니다. 이 패턴은 서비스를 중앙에서 관리하고 필요에 따라 검색하는 것을 포함합니다. 의존성 주입을 실현하기 어려운 상황에서 해결책이 될 수 있지만, 의존성 추적이 어려워지고 서비스 수명 주기 관리와 관련된 잠재적인 문제를 포함하여 새로운 문제들을 도입할 수 있습니다.


결론

싱글톤 패턴은 특정 상황에서 유용할 수 있으나, 그 사용은 신중하게 고려되어야 합니다. 상황에 따라 적절한 디자인 패턴의 선택이 시스템의 유지보수성과 확장성에 큰 영향을 미칠 수 있습니다. 따라서 싱글톤의 사용은 그 필요성과 장단점을 충분히 이해한 후에 결정해야 합니다.


보너스 챕터: 싱글톤 구현을 위한 열거형 사용

싱글톤 패턴을 구현하는 덜 알려진 하지만 흥미로운 방법은 enum (열거형)을 사용하는 것입니다. 이 접근법은 복잡한 직렬화나 리플렉션 공격에도 불구하고, 본질적으로 스레드 안전을 제공하고 여러 인스턴스화를 방지합니다.


열거형을 사용한 싱글톤의 장점:

· 스레드 안전성: 자바의 열거형은 설계상 스레드 안전합니다. JVM은 열거형 상수가 단 한 번만 인스턴스화되도록 보장함으로써 자연스럽게 싱글톤 행동을 제공합니다.

· 직렬화: 싱글톤에서 Serializable 인터페이스를 구현하는 것은 복잡할 수 있으며, 제대로 처리되지 않으면 여러 인스턴스가 생길 수 있습니다. 열거형은 직렬화 중에 단일 인스턴스를 유지함으로써 이 문제를 본질적으로 해결합니다.

· 리플렉션 공격 방지: 열거형은 리플렉션을 통한 인스턴스 생성을 방지하여 싱글톤이 깨질 수 있는 일반적인 방법에 대한 보호를 제공합니다.


이러한 장점에도 불구하고, 열거형을 사용한 싱글톤 구현은 평소와 다르게 느껴질 수 있으며, 특히 의존성 주입 프레임워크를 다룰 때 클래스 기반 구현보다 유연성이 떨어집니다. 그러나 외부 의존성 없이 보장된 단일 인스턴스가 필요한 간단한 사용 사례의 경우, 열거형은 강력한 대안이 될 수 있습니다.

Chris Martin Wigard / 자바 필드 인젝션의 함정: 견고한 코드로 가는 길 | 커리어리

커리어리

Chris Martin Wigard / 자바 필드 인젝션의 함정: 견고한 코드로 가는 길 | 커리어리

다음 내용이 궁금하다면?

또는

이미 회원이신가요?

2024년 4월 14일 오후 7:37

 • 

저장 2조회 306

댓글 0