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
'Python' 카테고리의 다른 글
Python 정규 표현식 기초 (0) | 2024.04.13 |
---|---|
Python 추상클래스 (0) | 2024.04.12 |
Python 날짜 시간 데이터 다루기 (feat. pandas) (1) | 2024.04.12 |
Python 날짜 시간 다루기 (feat. datetime) (0) | 2024.04.12 |
[작성중] Python 문서화 (feat. sphinx) (0) | 2024.04.12 |