디자인패턴

싱글톤(Singleton) 패턴 파헤치기

작취 2023. 12. 6. 00:18
반응형

싱글톤 패턴(Singleton pattern)이란?

싱글톤 패턴은 디자인 패턴중에 가장 간단한 패턴이다. 간단한만큼 자세하게 설명해놓은 글들이 많지 않으니까 정리하면서 잘 공부해보자.

 

싱글톤 패턴이란 단 하나의 객체를 만들기 위한 패턴이다. 객체가 필요할 때마다 새로 만드는게 아니라 최초에 한번 고정된 메모리 영역을 만들고 객체가 필요한 시점마다 만들어져있는것을 불러와서 사용하는 기법을 말한다.

 

이렇게 만들면 처음 new 연산자를 통해 만들어진 메모리 영역만 사용하기 때문에 메모리 절약에도 좋고 이미 생성된 객체를 활용하니 속도 측면에서도 좋다고 볼 수 있다.

 

얼핏 보면 전역변수와 같은 역할을 하는것 같지만 전역변수는 클래스가 사용되지 않을 때에도 메모리를 차지하고 싱글톤 패턴은 클래스가 사용될 때만 메모리를 차지한다는 차이가 있다. 싱글톤패턴이 좀더 상위호환인 느낌?

필요할 때만 메모리영역을 차지하게 만들 수 있다보니 주로 객체가 리소스를 많이 차지할 때 사용된다.


싱글톤 패턴 구현기법 

싱글톤패턴을 파이썬으로 구현하려면 크게 4가지 방법이 있다

 

각각의 방법은 장단점이 존재하며 상황에 맞게 알맞은 패턴을 사용하는 것이 좋다.

 

1. Using a decorator

  • decorator를 사용하면 다중상속을 받는것 보다 더 직관적으로 만들 수 있다.
  • MyClass를 사용하여 만든 객체는 싱글톤이지만 MyClass 는 클래스가 아니라 함수이기 때문에 클래스 메소드를 호출할 수 없다. 
def singleton(class_):
    instances = {}
    def getinstance(*args, **kwargs):
        if class_ not in instances:
            instances[class_] = class_(*args, **kwargs)
        return instances[class_]
    return getinstance

@singleton
class MyClass(BaseClass):
    pass

 

 

 

2. Using a base class

  • 위의 단점을 보완하여 Myclass가 진짜 클래스로 동작한다.
  • 가장 간단한 싱글톤 패턴 방식이다.
  • 다중상속으로 인해 여러 클래스가 관련된다면 에러가 생길 수 있다.
class Singleton(object):
    _instance = None
    def __new__(class_, *args, **kwargs):
        if not isinstance(class_._instance, class_):
            class_._instance = object.__new__(class_, *args, **kwargs)
        return class_._instance

class MyClass(Singleton, BaseClass):
    pass

 

 

 

3. Using a metaclass

  • 클래스 객체의 동작을 정의할 수 있다.
  • 자동으로 상속받을 수 있다.
  • __metaclass__를 클래스의 인수로 추가할 수 있다.
class Singleton(type):
    _instances = {}
    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances:
            cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
        return cls._instances[cls]

#Python2
class MyClass(BaseClass):
    __metaclass__ = Singleton

#Python3
class MyClass(BaseClass, metaclass=Singleton):
    pass

 

 

 

4. 모듈 사용

  • 파이썬에 존재하는 모듈 중 함수만 포함하는 모듈은 모두 싱글톤 역할 수행이 가능하다.
  • 사실 파이썬 쓸거면 그냥 모듈쓰는게 나을지도..

싱글톤 패턴의 문제점

위 설명만 보면 고정된 메모리 영역을 사용해서 메모리 낭비를 줄이고, 인스턴스를 불러오는 속도도 빨라지는 만능 패턴같지만 싱글톤 패턴도 당연히 문제점이 있다.

 

1. 의존성 문제

 

싱글톤 패턴은 클래스의 객체를 미리 생성한 뒤에 필요한 경우 정적 메서드를 이용하기 때문에 클래스 사이에 의존성이 높아진다.

클래스 사이의 의존성이 높으니까 하나의 싱글톤 인스턴스가 변경되면 관련있는 모든 클래스를 수정해야 한다.

 

2. 단위테스트를 수행하기 어렵다

 

싱글톤 인스턴스는 자원을 공유하고 있기 때문에 모듈을 독립적으로 테스트하기 힘들다. 독립된 상태에서 테스트가 이루어지려면 매번 싱글톤 인스턴스를 초기화 해줘야하는데 번거롭고 귀찮다.

 

3. 결합도가 높아지다보니 유지보수가 까다롭고 힘들다

 

말 그대로 하나 건들면 줄줄이 소세지마냥 엮어서 다 수정해야한다.


오늘의 디자인패턴 공부는 여기까지. 싱글톤패턴을 공부하다 S.O.L.I.D 원칙을 알게 되었는데 다음에는 이것에 대해 더 자세히 공부해봐야겠다.

반응형