디자인 패턴 - 싱글톤(Singleton) 패턴

2023. 7. 31. 23:11·Own/Memo

싱글톤이란?

글로벌하게 접근 가능한 하나의 객체를 제공하는 패턴

로깅, 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=&currentPage=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
'Own/Memo' 카테고리의 다른 글
  • OAuth 와 OpenID
  • API 아키텍처 - REST와 RPC
빵빵0
빵빵0
(아직은) 공부하고 정리하는 블로그입니다.
  • 빵빵0
    Hack Your World
    빵빵0
  • 전체
    오늘
    어제
    • 분류 전체보기 (92)
      • Error Handling (7)
      • Project (5)
        • MEV (2)
      • Architecture (0)
        • API (0)
        • Cache (0)
        • 사소한 고민거리 (0)
      • Computer Science (4)
        • Data Structure (2)
        • Database (1)
        • Cloud (0)
        • OS (0)
        • Infra, Network (1)
        • AI (0)
      • Language (8)
        • Go (8)
        • Rust (0)
        • Python (0)
        • Java (0)
      • Algorithm (40)
        • BaekJoon (18)
        • Programmers (7)
        • LeetCode (6)
        • NeetCode (9)
      • SW Books (9)
        • gRPC Up & Running (1)
        • System Design Interview (2)
        • 스프링 입문을 위한 자바 객체지향의 원리와 이해 (6)
        • 블록체인 해설서 (0)
        • 후니의 쉽게 쓴 CISCO 네트워킹 (0)
      • BlockChain (4)
        • Issues (0)
        • Research (4)
        • Tech (0)
      • Own (8)
        • TIR(Today I Read) (3)
        • Personal (2)
        • Novel (0)
        • Memo (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    MEV
    goroutine
    Palindrome
    go
    DP
    chart
    golang
    MongoDB
    블록체인
    BEAKJOON
    two pointer
    Programmers
    백준
    BaekJoon
    큐
    ethereum
    blockchain
    Greedy
    EVM
    NeetCode
    candlechart
    BFS
    context
    LeetCode
    프로그래머스
    KBW
    스택
    2024
    Hash Table
    Python
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
빵빵0
디자인 패턴 - 싱글톤(Singleton) 패턴
상단으로

티스토리툴바