DEVELOPMENT

싱글턴 패턴(Singleton Pattern)의 현 주소

OSP 2026. 2. 4. 22:06

싱글턴 패턴(Singleton Pattern)의 현 주소


  • 서론
    • 더보기

      • 싱글톤 패턴은 개념적으로 단순해 유명한 패턴이기도 하면서, 동시에 개발자 커뮤니티에서는 안티패턴에 가깝게 취급되며 악명이 자자한 패턴이기도 하다. 이 글은 이런 부정적 평가의 이유를 분석하려는 의도에서 시작한다.
      • 우선 싱글턴 패턴 자체의 기원적 정의에 대해 알아본다. 이후 현대적 개발환경에서 싱글턴이 어떻게 재해석되고 있는지 살펴보며, 이 과정을 통해 "싱글톤이 왜 불편한가?"라는 질문에 답해본다.
  • 싱글턴
    • 기원적 정의 : 유일성 + 전역성
    • 더보기

       

      1. 싱글톤의 정의는 다음과 같다.(Design Patterns, GoF, 1994)
        • Ensure a class has one instance, and provide a global point of access to it.
      2. 기원적으로 싱글턴은 단일인스턴스보장 전역진입점제공이라는 두 요소로 정의된다.
        • 첫번째 요소는 비교적 직관적이며, 그 구현도 비교적 쾌적하다. 생성자를 외부에 노출하지 않아(private), 클래스 내부에서 인스턴스를 하나만 생성하도록 강제함으로써 객체의 개수를 통제한다. 이는 패턴의 의도를 코드레벨 이전의 언어 차원에서 고정시킨다.
        • 두번째 요소가 더 중요하면서도 논쟁적이다. 싱글턴은 단일 인스턴스를 의미 있는 사용을 위해 어디서든 접근 가능한 하나의 진입점을 제공한다. static getInstance() 같은 형태로 구현되며, 이는 사실상 전역 접근 수단이다.
      3. 이 패턴은 설정 객체, 로깅 시스템, 하드웨어 자원관리자처럼 여러 개가 존재할 필요가 없는 대상을 표현하는데 사용되었다. 개념적으로 유일해야 하는 존재, 통제되는 전역 상태를 겨냥한 패턴이다. 
        • 사용례가 암시하듯 싱글턴패턴이 겨냥하는 대상은 개념적으로 유일하기만 해서는 안 되고, 일관성도 갖추어야 한다. private 생성자로 단일인스턴스를 보장하고, 흩어져있지 않고 단일한 진입점으로 대상에 데이터 일관성을 해결하려는 의도로 보인다. 
        • 문제는 이 전역성이 내포한 구조적 위험에 있다. GoF시기에는 개발효율보다 자원효율을 중시하던 시대였기 때문에, 유일한 자원의 관리라는 장점이 더 크게 평가된 것으로 보인다..
    • 현대적 접근 : 전역성 기피
    • 더보기

      1. 현대 싱글턴 설명에서는 전역접근이라는 표현이 자주 실종된다. GoF 이후에 싱글턴패턴을 새로이 정의했다는 것은 찾아볼 수 없었다. 개발자들 행동패턴상 주도적으로 새로 정의하는 것은 쉽지 않고, 소극적인 해결책으로 불편한 요소를 의도적으로 희석하는 것으로 보인다. 이 배경에는 몇가지 흐름이 있다.
        • 개발 효율을 높게 평가하는 현대 프로그래밍에서는 테스트 가능성의존성 명시가 중요하다. 그러나 전역성은 테스트 순서에 따라 결과가 달라지게 만들어 단위테스트(Unit Test)의 독립성을 거의 즉사시킨다. 또한 전역이라 인자로 받지 않아도 바로 호출할 수 있으니 의존성이 코드 밖에 숨어버린다.
        • 둘째로 DI(Dependency Injection)컨테이너가 일반적으로 보급되었다. 개발자는 더이상 getInstance()를 호출하지 않고 프레임워크가 객체를 주입해준다. 이 과정에서 전역접근이라는 독소조항은 프레임워크 내부로 숨겨지고, 단일 인스턴스라는 목적만 취할 수 있게 되었다. 
        • 또 현대에서는 JVM의 JMM(Java Memory Model)은 데이터 일관성을 위한 규칙을 언어 차원에서 지원한다. 따라서 데이터 일관성을 위해서 단일 인스턴스에 더해 "A" Global Access/전역성까지 채택할 이유는 약해진 반면 구조적 위험은 여전히 짊어지고 있는 셈이 된 것.
      2. 다양한 배경들로 현대에서 싱글턴을 냄새나는 존재로 취급하는 장면은 약간 밈처럼 느껴지기도 한다.(실제로 code smell, stink라 표현한다) 다만 싱글턴의 악명은 싱글턴 자체라기 보다는, 전역성이라는 일 요소에서 기인한 것으로 보인다. 전역성은 코드를 엄청나게 큰 머리카락 공으로 만들어 버린다.

       

  • 정리
  • 더보기

     

    • 범인은 싱글턴이 아니라 전역성
    • 근데 이제 안 그래도 이미지 별로였는데 더 개선된 것까지 나와서 이걸 계속 써야 하나 싶은 약간 그런