728x90

싱글턴 패턴이란

일반적으로 클래스가 정의되면 클래스로부터 여러 개의 객체를 생성할 수 있음

하지만 특수한 경우 객체를 하나만 생성하도록 제한하는게 유용한 경우가 있음

 

싱글턴(Singleton) 패턴은 소프트웨어 디자인 패턴 중 하나로, 클래스의 인스턴스를 단 하나만 생성하고 그 인스턴스에 대한 전역적인 접근을 제공하는 패턴

사용자가 여러 번 객체 생성을 하더라도 클래스로부터 오직 하나의 객체만 생성됨

이 패턴은 일반적으로 다음과 같은 상황에서 사용됨

  • 클래스의 인스턴스가 오직 하나만 존재해야 하는 경우
  • 클래스의 인스턴스가 공유되어야 하는 경우
  • 전역 객체를 사용하여 리소스를 공유하고 관리해야 하는 경우

싱글턴 패턴을 활용하면 유용한 상황

  • 로깅 시스템
    로깅은 어플리케이션 개발 및 유지보수에 있어서 매우 중요한 부분
    로깅 시스템을 구현할 때 여러 곳에서 동시에 로그 파일에 접근하고 기록할 수 있지만, 로그 파일 자체는 하나의 인스턴스만 있으면 충분함
    이런 경우에 싱글턴 패턴을 사용하여 로그 인스턴스를 공유하고 여러 곳에서 접근할 수 있음
  • 캐싱
    캐싱은 데이터나 계산 결과를 임시로 저장하여 다음에 같은 데이터나 계산 결과가 필요할 때 다시 계산하는 것을 방지함
    예를 들어, 데이터베이스 쿼리 결과를 캐싱하여 동일한 쿼리가 여러 번 실행되는 것을 방지할 수 있음
    이때 캐시 객체는 여러 곳에서 공유되어야 하기 때문에, 싱글턴 패턴을 사용하여 캐시 객체를 구현할 수 있음
  • 설정 관리
    어플리케이션의 설정 정보는 전역적으로 접근되어야 하며, 한 번 로드되면 여러 곳에서 공유되어야 함
    따라서 설정 관리자 객체를 싱글턴으로 구현하여 설정 정보에 대한 중복 로드를 방지하고 설정 정보에 대한 일관성을 유지할 수 있음
  • 데이터베이스 연결 풀
    데이터베이스 연결은 비용이 많이 드는 작업이므로, 연결을 재사용하여 성능을 향상시키는 것이 중요함
    데이터베이스 연결 풀을 구현할 때 싱글턴 패턴을 사용하여 연결을 관리하고 재사용할 수 있음
  • 응용 프로그램 상태 관리
    응용 프로그램의 상태 정보는 여러 곳에서 공유되어야 하며, 상태 정보가 한 곳에서 변경되면 모든 곳에서 변경된 상태를 반영해야 함
    이런 경우에 상태 관리자 객체를 싱글턴으로 구현하여 상태 정보를 효율적으로 관리할 수 있음

파이썬에서의 싱글턴 패턴

파이썬에서 싱글턴 패턴을 구현하는 가장 일반적인 방법은 __new__ 메서드를 이용하여 객체 생성을 제어하는 것

__new__ 메서드는 클래스의 인스턴스를 생성하는 역할을 담당하며, 해당 클래스의 인스턴스가 생성되기 전에 호출됨

따라서 __new__ 메서드를 사용하여 인스턴스를 생성할 때 이미 생성된 인스턴스가 있는지 확인하고, 있다면 해당 인스턴스를 반환하도록 구현할 수 있음

class Singleton(object):
    def __new__(cls, *args, **kwargs):
        # 객체가 한 번도 생성되지 않은 경우에만 생성
        if not hasattr(cls, "_instance"):
            print("__new__ is called\n")
            cls._instance = super().__new__(cls, *args, **kwargs)
        return cls._instance

    def __init__(self, data):
        cls = type(self)
        # 초기화가 한 번도 호출되지 않은 경우에만 초기화 진행
        if not hasattr(cls, "_init"):
            print("__init__ is called\n")
            self.data = data
            cls._init = True


s1 = Singleton(3)
s2 = Singleton(4)
print(s1.data) # 3
print(s2.data) # 3 (s1에서 초기화 했으므로 초기화 함수 pass함)

 

728x90

+ Recent posts