언어 Language/파이썬 Python

[디자인 패턴] 싱글턴 패턴과 파이썬 예제 코드

Tap to restart 2025. 4. 26. 15:00

싱글턴 패턴은?

생성 패턴 중 하나로 전역에서 접근 가능한 하나의 객체를 제공하는 패턴이다.

 

언제 사용하는가?

로깅이나 데이터베이스 작업, 설정값처럼 단일 객체가 필요한 경우에 사용한다.

설정값을 예로 들어보자. 설정은 프로그램 전역에서 사용하며 당연히 같은 값을 반환해야 한다. 굳이 여러 객체를 만들어서 사용해야 할 이유가 없다.

 

사례

파이썬 웹프레임워크인 장고의 설정 사례를 살펴보자.

장고에서 설정값을 불러와서 사용할 때

from django.conf import settings

식으로 불러와서 사용하게 된다. 이 settings가 싱글턴 패턴으로 되어 있다.

 

django/conf/__init__.py 파일을 보면 아래처럼 선언되어 있다.

settings = LazySettings()

 

출처: https://github.com/django/django/blob/main/django/conf/__init__.py

 

settings.DEBUG 등 settings 객체에 처음 접근할 때 LazySettings가 Settings 객체를 생성하고, 이후 같은 객체를 사용한다.

 

예제 코드

싱글턴 패턴을 확인할 수 있는 파이썬 예제 코드는 아래와 같다.

class Singleton(type):
    _instance = None

    def __call__(cls, *args, **kwargs):
        if cls._instance is None:
            cls._instance = super().__call__(*args, **kwargs)
        return cls._instance


class MySingleton(metaclass=Singleton):
    text = None


s1 = MySingleton()
s1.text = "Hello"
print(s1)
print(s1.text)

s2 = MySingleton()
print(s2)
print(s2.text)

 

 

위 코드를 실행해보면 아래 예와 같은 결과가 나온다. s1과 s2가 같은 메모리주소에 존재하는 것을 알 수 있다.

<__main__.MySingleton object at 0x1029b49a0>
Hello
<__main__.MySingleton object at 0x1029b49a0>
Hello