노트

싱글턴 패턴

Singleton

설계#pattern · 연결된 개념 8개

쉽게 말하면

싱글턴 패턴은 회사에 공용 프린터를 딱 한 대만 두고 모두가 그걸 찾아 쓰게 하는 거예요. 설정처럼 하나만 있어야 하는 것을 어디서든 같은 것으로 꺼내 쓸 수 있죠.

비유가 깨지는 곳 어디서든 꺼내 쓸 수 있다는 게 함정이에요. 사실상 전역 변수라 의존 관계가 숨고 테스트끼리 상태를 공유해서, 의존성 주입이나 한 번만 평가되는 모듈을 먼저 고려해요.

클래스의 인스턴스를 하나로 제한하고 그 인스턴스에 접근할 전역 지점을 주는 패턴. 생성자를 막고 정적 메서드로 하나뿐인 인스턴스를 돌려준다.

class Config {
  private static instance?: Config
  private constructor(readonly values: Record<string, string>) {}
  static get() {
    return (this.instance ??= new Config(loadValues()))
  }
}

남용을 조심한다

  • 사실상 전역 변수라서 숨은 결합을 만든다. 어디서든 꺼내 쓸 수 있으니 의존 관계가 코드에 드러나지 않는다
  • 테스트끼리 상태를 공유해 순서에 따라 결과가 달라지고, 가짜로 바꿔 끼우기 어렵다
  • 그래서 대안을 먼저 본다. 필요한 곳에 인스턴스를 넘겨주는 의존성 주입(Dependency Injection, DI)이나, 모듈을 한 번만 평가하는 언어 특성을 쓰는 방법이다. ES 모듈과 파이썬 모듈은 처음 import될 때 한 번만 실행되므로 모듈 수준 객체가 이미 싱글턴 역할을 한다(모듈 패턴과 노출 모듈 패턴, 파이썬 모듈과 패키지)

스프링 빈은 기본이 싱글턴 스코프(Singleton Scope)지만, 클래스가 스스로 하나임을 강제하는 게 아니라 컨테이너가 하나만 만들어 주입하는 방식이라 위 문제가 덜하다(빈 스코프). 대신 상태를 가진 싱글턴 빈은 여러 요청이 동시에 공유하니 조심해야 한다. 생성 패턴 전체는 생성 패턴.

출처: Singleton — Refactoring.Guru

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 파이썬 클래스 기초

    파이썬 클래스는 데이터 속성(attribute)과 메서드를 묶은 타입이고, 클래스를 호출해 인스턴스(instance)를 만든다. 메서드의 첫 매개변수 self가 호출한 인스턴스 자신이며, 호출할 때는 파이썬이 자동으로 채워 넘긴다.

  • 데코레이터 패턴

    같은 인터페이스를 구현한 래퍼로 객체를 감싸, 원래 객체를 고치지 않고 앞뒤에 기능을 덧붙이는 패턴. 래퍼를 여러 겹 쌓아 기능을 조합할 수 있다.

  • 팩토리 메서드 패턴

    객체 생성을 생성자 호출 대신 전용 메서드(또는 함수)에 맡기는 패턴. GoF(Gang of Four)의 원래 형태는 상위 클래스가 생성 메서드를 선언하고 하위 클래스가 어떤 제품을 만들지 정하는 구조지만, 실무에서는 "생성을 감싸는 함수" 전반을 넓게 가리키기도 한다.

  • 상태 패턴

    객체의 행동이 현재 상태에 따라 달라질 때, 상태마다 별도 객체를 두고 현재 상태 객체에 행동을 맡기는 패턴. 상태별 조건문이 메서드마다 반복되는 문제를 푼다.

  • 디자인 패턴

    반복해서 나타나는 설계 문제에 대한 검증된 해결 구조와 그 이름. 복사해 쓰는 완성 코드가 아니라 객체들이 협력하는 방식을 설명하는 어휘다. 1994년 이른바 GoF(Gang of Four, 네 명의 저자)의 책 『Design Patterns: Elements of Reusable Object-Oriented Software』가 23개 패턴을 정리하며 널리 퍼졌다.

보기 옵션