오히려 좋아..

상황이 나쁘게만 흘러가는 것 같을 때 외쳐보자.. .

궁금한 마음으로 포트폴리오 보기

Paradigm/OOP-t

[Design Pattern] 싱글톤 패턴(파이썬)

junha6316 2021. 3. 25. 06:07

1. 싱글톤 패턴(Singleton Pattern)이란?

전역적으로 접근 가능한 하나의 객체만을 허용하는 패턴 즉 프로세스(?)내에 하나밖에 존재하지 않는 것을 보장해주는 패턴을 의미한다.

그럼 어떤 때 유용하게 사용할까? 싱글톤 패턴은 하나의 리소스에 대한 동시 요청의 충돌을 막기 위해 많이 사용된다

예로는 로그나 데이터베이스와 관련된 작업에 많이 사용된다.

 

싱글톤 디자인 패턴의 목적은 다음과 같다.

 

1. 클래스에 대한 단일 객체 생성

2. 전역 객체

3.공유된 리소스에 대한 동시접근 제어

 

2. 싱글톤 패턴 구현(Implementation of Singleton Pattern)

class Singleton(object):

	""" Definition of Singleton Pattern """
    
    def __new__(cls):
    	if not hasattr(cls, 'instance'):
        	cls.instance = super(Singleton, cls).__new__(cls)
        return cls.instance
          
 
    		

위에서 보이는 것처럼 파이썬 매직 메서드인 __new__를 오버라이드해서 객체를 생성하는데  Singleton 클래스가 hasattr을 통해 instance가 존재하는지 확인하고 없으면 새로 생성해주고 있으면 기존의 인스턴스를 반환해준다. 

 

아래와 같이 메타 클래스를 이용해 구현하는 방법 역시 존재한다. 메타 클래스는 일종의 상위 클래스로 하위 클래스의 행위를 재정의 할 수 있다.

class Metamong(type):

	""" Meta class Definition """
    
    _instances = {}
    
    def __call__(cls, *args, **kwds):
    	# __call__은 이미 존재하는 클래스의 객체를 생성할 떄 호출하는 메소드
    	if cls not in cls._instances:
        	cls._instances[cls] = super(Metamong, cls).__call(*args, **kwargs)
        return cls._instctances[cls]
        
class Pickachu(metaclass=Metamong):

    """ 피카츄 class Definition """
	pass
    


    	

 

3. 싱글톤 패턴의 종류

싱글톤 패턴에는 다음과 같은 종류가 있다.

1. 게으른 초기화(Lazy Instantiation)

인스턴스가 정말 필요할 때 생성되는 패턴으로 리소스가 제한적인 상황일 때 객체가 꼭 필요한 시점에서 생성 된다.

구현은 아래와 같다.

class Singleton:
	__instance = None
    def __init__(self):
    
    	if not Singleton.__instance:
        	# 인스턴스가 존재하지 않을 때 구현
        	print("__init__ method called ..")
            
        else:
        	# 인스턴스가 이미 존재 할 때 구현
            print("Instance already created", self.getInstance())
    
    @classmethod
    def getInstance(cls):
    	if not cls.__instance:
        	cls.__instance = Singleton()
        return cls.__instance
        	

getInstance라는 메서드로 필요한 시점에서 해당 객체의 인스턴스를 필요한 시점에서 생성할 수 있다.

 

2. 모노싱글톤 패턴(Monostate Singleton Pattern)

Alex Martelli이 주장한 패턴으로 인스턴스의 개수가 중요한게 아니라 객체의 상태와 행위가 더 중요하다는 관점에서 나온 패턴으로

실제로 전역적으로 존재하는 객체의 개수가 반드시 한개인게 아니라 객체의 개수가 여러개라도 이 객체들이 동아ㅣㄹ

구현은 아래와 같다.

#__init__을 이용해 구현하는 방법
class MonoState:
	__state = {"1", "2"}
    
    def __init__(self):
    	self.x=1
        self.__dict__ = self.__state
        pass
        
 
 
 # __new__를 이용해 구현하는 방법
 class MonoState:
 	_state={}
    def __new__(cls, *args, **kwargs):
    	obj = super(Monostate, cls).__new__(cls, *args, **kwargs)
        obj.__dict__ = cls._state
        return obj

__dict__라는 메서드는 클래스가 같고있는 attribute를 Dictionary 형태로 반환한다. 

 

 

4. 예시

1. 클라우드 서비스에는 하나의 데이터베이스에 접근하는 여러 모듈이 있는데 데이터베이스의 일관성을 보장하기 위해선 연산간의 충돌이 없어야한다. 이런 경우 connection 해주는 객체를 싱글톤으로 작성해주면 데이터베이스의 동기화가 보장된다.

하짐나 단일 웹 앱 형태가 아니라 여러 웹앱이 같은 db에 접근할 경우 각 웹앱이 db에 접근할 때 싱글톤을 생성하기 때문에 비효율적이다

이럴 때는 풀링 기법을 사용하는 것이 좋다.

 

2. 인프라 상태를 확인하는 서비스 HealthCheck 클래스를 싱글톤으로 구현한다고 한다.

잘 이해 안감..