싱글턴: 하나라는 범위부터 정하기
싱글턴은 정해진 범위에서 클래스의 인스턴스를 하나로 제한하고 접근 지점을 제공하는 패턴입니다. 여기서 먼저 물어야 할 것은 **‘어디까지 하나인가?’**입니다. 프로세스 안의 객체 하나와 여러 서버 전체의 객체 하나는 다릅니다.
간단한 한 프로세스 예제
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개 실행하면 이 클래스의 객체가 서비스 전체에서 하나만 생길까요?
해설 보기
아닙니다. 각 프로세스는 별도의 메모리를 가지므로 각각 인스턴스를 가질 수 있습니다. 이 패턴으로 분산 환경의 단일 실행이나 데이터 일관성이 자동 보장되지는 않습니다.