Develope/Python
[Python] Pattern - Singleton (싱글톤)
noggame
2022. 1. 8. 22:22
Singleton
ㅇ 사용 목적
- 하나의 클래스가 오직 하나의 인스턴스만을 가지도록하여, 해당 인스턴스를 전역에서 접근 가능하도록 제공
- 주로 Logging 이나 DB 접근에서 사용. (자주 호출되는 인스턴스가 필요한 경우 정의/사용)
ㅇ 장점
- 필요할 때 단일 인스턴스를 생성, 생성된 인스턴스는 메모리에 상주하며 다음 호출시 사용
ㅇ 주의
- 생성된 인스턴스는 메모리에 상주하고 있기 때문에 자원관리 필요
- 하나의 인스턴스 자원을 공유하므로 ripple effect 주의
ㅇ MariaDB 예제
더보기
- Singleton DB Class 정의
import mariadb
class MetaSingleton(type):
_instances = {}
def __call__(cls, *args, **kwds):
if cls not in cls._instances:
cls._instances[cls] = super(MetaSingleton, cls).__call__(*args, **kwds)
return cls._instances[cls]
class MyDBManager(metaclass=MetaSingleton):
_connection = None
_cur = None
def connect(self):
try:
if not self._connection:
self._connection = mariadb.connect(
user='root',
password='mypasswd',
host='127.0.0.1',
port=3306,
database='mydb')
self._cur = self._connection.cursor()
return self._cur
except mariadb.Error as e:
print(f'[ERR] Connecting to MariaDB : {e}')
def createTable(self, table_name):
# implements...
pass
- Singleton 클래스 사용
from MyDBManager import MyDBManager
mdbm = MyDBManager()
dbcur = nbdm.connect()
dbcur.execute("SELECT * FROM mytable")
for data in dbcur:
print(data)
- 한 번 선언된 이후에는 타-클래스에서 바로 사용 가능
from MyDBManager import MyDBManager
db_inst = MyDBManager().createTable("myTable")
ㅇ 참조
- https://refactoring.guru/design-patterns/singleton
- https://python.astrotech.io/design-patterns/creational/singleton.html