싱글톤이란?
글로벌하게 접근 가능한 하나의 객체를 제공하는 패턴
로깅, DB 등 동일한 리소스에 대한 동시 요청의 충돌 방지
하나의 인스턴스를 공유하는 작업에 주로 사용
ex) 여러 서비스의 로그를 동일한 로깅 객체를 사용해 로그파일에 순차적으로 남기는 경우
하나의 클래스에 대해 어플리케이션이 시작될 때 최초 한번만 메모리를 할당하고, 그 메모리에 인스턴스를 생성
즉, 인스턴스를 하나만 생성한다.
클래스에 대한 단일 객체 생성(하나의 클래스에 단 하나의 인스턴스 허용 -> __new__ 메서드 재정의, 해당 메서드 내에서 이미 객체가 생서됐다면 객체를 생성해주지 않도록 처리)
class Singleton(object):
def __new__(cls, *args, **kwargs):
if not hasattr(cls, "_instance"): # Foo 클래스 객체에 _instance 속성이 없다면
print("__new__ is called\n")
cls._instance = super().__new__(cls) # Foo 클래스의 객체를 생성하고 Foo._instance로 바인딩
return cls._instance # Foo._instance를 리턴
def __init__(self):
print("__init__ is called\n")
s1 = Singleton()
s2 = Singleton()
print(s1)
print(s2)
전역 객체 제공
공유된 리소스에 대한 동시 접근 제어
객체의 유일성을 보장해주어야하는 특수 케이스
Lazy instantiation
게으른 초기화
모듈을 import 할 때, 아직 필요하지 않은 시점에 객체를 미리 생성하는 경우가 있음.
게으른 초기화는 인스턴스가 필요한 시점에! 객체를 생성하는 방법(주로 사용할 수 있는 리소스가 제한적인 상황에서 사용)
장점
- 고정된 메모리 영역을 얻어 하나의 인스턴스만 생성하기 때문에 메모리 낭비 방지
- 인스턴스가 전역적으로 사용될 수 있기에 다른 클래스의 인스턴스들이 데이터를 공유하고 변경 가능
단점
- 싱글톤 인스턴스에게 많은 일을 위임하거나, 많은 데이터를 공유시킬 경우, 다른 클래스의 인스턴스 간에 결합도가 높아져 개방 폐쇄 원칙에 위배됨
- 멀티 스레드 환경에서 데이터 동기화 문제가 발생할 수 있음 -> 전역 변수의 문제점: 어디서 변경될지 모른다
참고자료:
- https://wikidocs.net/69361
- https://blog.naver.com/PostView.naver?blogId=chlrkfka949&logNo=222080429033&categoryNo=58&parentCategoryNo=0&viewDate=¤tPage=1&postListTopCurrentPage=1&from=search&userTopListOpen=true&userTopListCount=30&userTopListManageOpen=false&userTopListCurrentPage=1
'Own > Memo' 카테고리의 다른 글
OAuth 와 OpenID (0) | 2023.07.31 |
---|---|
API 아키텍처 - REST와 RPC (0) | 2023.07.31 |