라떼군 이야기


6 / 13강

싱글턴: 하나라는 범위부터 정하기

싱글턴은 정해진 범위에서 클래스의 인스턴스를 하나로 제한하고 접근 지점을 제공하는 패턴입니다. 여기서 먼저 물어야 할 것은 **‘어디까지 하나인가?’**입니다. 프로세스 안의 객체 하나와 여러 서버 전체의 객체 하나는 다릅니다.

간단한 한 프로세스 예제

class Settings:
    _instance = None
    def __new__(cls):
        if cls._instance is None:
            cls._instance = super().__new__(cls)
            cls._instance.debug = False
        return cls._instance

a = Settings()
b = Settings()
a.debug = True
print(a is b)
print(b.debug)

출력은 True, True입니다. 두 번 만든 것처럼 보여도 같은 객체를 반환하므로, a에서 바꾼 debug가 b에서도 보입니다. 이 예제는 한 스레드에서 개념을 이해하기 위해 줄인 구현입니다. 동시 생성의 안전성, 상속, 직렬화 같은 문제를 모두 해결한 구현은 아닙니다.

편한 접근에는 비용이 따릅니다

어디서나 같은 객체를 읽고 바꿀 수 있으면 코드의 의존 관계가 숨습니다. 테스트가 남긴 설정이 다음 테스트에 영향을 줄 수도 있습니다. 초기화 순서와 정리 시점도 명확해야 합니다.

공유 객체가 필요하다고 항상 싱글턴을 강제할 필요는 없습니다. 프로그램 시작점에서 객체를 한 번 만들고 필요한 곳에 전달하면, 공유 범위를 드러내면서 테스트용 객체로 바꾸기도 쉽습니다. 여러 프로세스 사이의 일관성은 데이터베이스나 별도 조정 방식의 문제입니다.

확인 문제

서버 프로세스를 4개 실행하면 이 클래스의 객체가 서비스 전체에서 하나만 생길까요?

해설 보기

아닙니다. 각 프로세스는 별도의 메모리를 가지므로 각각 인스턴스를 가질 수 있습니다. 이 패턴으로 분산 환경의 단일 실행이나 데이터 일관성이 자동 보장되지는 않습니다.

제품 기획, 개발 파트너 찾으시나요? 개인, 팀, 기업 모두 환영. 문제 정의부터 출시까지 함께합니다.