설계패턴 9. Singleton Pattern

LSDrug·2024년 6월 9일

설계패턴(完)

목록 보기
9/26

Singleton Patter

1. 개요

글로벌하게 접근 가능한 단 한개의 객체만을 허용하는 패턴이다.

해당 패턴은 다음과 같은 성격을 가진다.

  • 클래스에 대한 단일 객체를 생성한다.
    예) DB 접근시, Client가 여럿이되, 하나의 객체만 강제하는 경우.
    -> 단일 객체가 아니면 혼동이 생길 수 있다.
    -> Singleton Pattern을 통해 단일 객체를 이용한다.
  • 전역 객체를 제공한다.
  • 공유된 리소스에 대한 동시 접근 제어
  • 글로벌 액세스 지점을 제공하는, 단점이 거의 없는 검증된 패턴이다.

2. 도식화

  • 생성자를 private로 선언하고, 객체를 초기화하는 static 함수를 만들어 구현할 수 있다. 이때, 첫 호출에 객체가 생성되고 그 후 클래스는 동일한 객체를 계속 반환한다.
  • 하나의 Singleton 클래스 인스턴스를 생성하고, 이미 생성된 인스턴스가 있다면 재사용한다.

3. Singleton과 Metaclass

  • 간단히, 클래스를 만드는 클래스를 Metaclass라 한다.
  • type은 객체의 클래스 종류를 알아낼 때도 사용되지만, 클래스를 만들어낼 수도 있다.
  • type을 상속받게 되면 메타클래스가 되며, 주로 클래스의 동작을 제어할 때 사용된다.
  • 메타클래스는 해당 함수를 통하여 객체 생성에 관한 제어를 할 수 있다.

메타클래스의 동작

Metaclass의 call 함수 내부에 인스턴스 생성여부를 확인하는 로직이 있으며, 클래스에 의해 Singleton으로 지정된 Box 클래스의 인스턴스가 생성될 때, Metaclass의 call 함수가 호출되면서 Box의 생성을 제어함 (Singleton 성질을 가지게 된다.)

4. Monostate Singleton Pattern

Singleton Pattern의 정의는 반드시 한 개의 클래스 객체만 존재하여야 한다.

하지만, Alex Martelli는 상태를 공유하는 인스턴스가 필요하다고 주장했다.

즉, 객체의 생성여부보다, 객체의 상태와 행위가 더 중요한 것이다.

해당 패턴은 모든 객체가 같은 상태를 공유하는 패턴이다.

  • 주소는 다 다르나, state(상태)는 같다.
  • 각자의 client들이 각자의 객체를 다룰 수 있다.
  • 모든 객체는 객체의 변수정보들을 담고 있는 딕셔너리가 존재한다. 딕셔너리는 클래스에 속한 변수들을 내부적으로 보관한다.

해당 코드 사진을 통해 자세하게 파악할 수 있다.

5. 파이썬에서의 싱글톤 패턴

파이썬에서는 import 방식 때문에 모든 모듈은 기본적으로 싱글톤이다.

파이썬의 작동방식을 살펴보면

  • 파이썬 모듈이 import 되었는지 확인한다.
  • import 되었다면 해당 객체를 반환하고 안되었다면 import를 instance화 한다.
  • 모듈은 import와 동시에 초기화되지만, 같은 모듈을 다시 import하면 초기화되지 않는다.
  • 그래서, 한 개의 객체만 유지하고 반환하는 싱글톤 방식이다.

6. Singleton 패턴의 단점

싱글톤 패턴은 효율적이지만 단점도 존재한다.

  • 전역 변수의 값이 실수로 변경된 것을 모르고 애플리케이션에서 사용될 수 있다.
  • 같은 객체에 대한 여러 참조자가 생긴다.
  • 전역 변수에 종속적인 모든 클래스 간 상호관계가 복잡해질 수 있다. 전역 변수 수정이 필요하게 되면 의도치 않게 다른 클래스에도 영향을 줄 수 있다.

7. 예시

DB를 활용하는 클라우드 서비스를 생각해보자.

이 문제에 관해서는 다음을 생각해볼 수 있다.
클라우드 서비스 내 DB에 접근하는 여러 개의 모듈이 있을 수 있다.
여러 개의 서비스가 한 개의 DB를 공유하고 있는 구조를 떠올리면 된다.


profile
마약같은 코딩, 마약같은 코딩러

0개의 댓글