티스토리 뷰

Backend/꾸준히 TIL

[디자인패턴] 싱글톤 패턴

개발하는 후딘 2023. 4. 7. 14:48
728x90
반응형

싱글톤패턴

  • 객체의 인스턴스가 오직 1개만 생성되는 패턴
    • 처음에 인스턴스를 호출할 때만 객체의 인스턴스를 만들며, 그 이후에는 호출하면 생성하지 않는다.
    • 객체의 인스턴스를 메모리의 스택영역에 저장한다.
      • 전역으로 인스턴스를 나타냄. 
      • 호출할 때마다 동일한 인스턴스를 리턴.
  • 생성자는 private 접근제한자를 가지므로, 외부에서 생성자를 호출하지 못하도록 막는다.

싱글톤 패턴을 사용하면 어떤 장점을 갖는가?

  • 다른 클래스간의 데이터와 리소스 공유가 쉽다.
    • 유틸리티로 많이 쓰인다.
    • 데이터베이스, 파일과 같은 공유리소스에 대한 액세스를 제어한다.
  • 다른 클래스의 인스턴스들이 접근하여 사용할 수 있다.
    • 한개의 인스턴스를 가지고 전역으로 접근이 가능하며, 다른 코드가 해당 인스턴스를 덮어쓰지 못하도록 보호한다.
    • 하지만, 여러 클래스의 인스턴스에서 싱글톤 인스턴스의 데이터에 동시에 접근하게되면 동시성문제가 발생할 수 있으므로 이점을 유의해서 설계.
  • 메모리 낭비 방지
    • 고정된 메모리 영역을 사용.
    • 이미 생성된 인스턴스를 활용하므로 

싱글톤 패턴의 문제점은 무엇인가?

  • 테스트가 어렵다.
    • 싱글톤 인스턴스는 자원을 공유하고 있기 때문에 격리된 환경에서 수행되려면 매번 인스턴스의 상태를 초기화시켜야 함.
    • 애플리케이션 전역에서 상태를 공유하여 테스트가 어려워지게됨.
  • SOLID 원칙중 DIP를 위반하게되어 OCP 원칙 또한 위반할 가능성이 높다.

싱글톤패턴의 예시 

- typescript

class Singleton {
	private static instance :Singleton; 

	// 생성자를 비공개로 한다.
	private constructor() {}

	public static getInstance(): Singleton {
		if( !Singleton.instance ) {
			Singleton.instance = new Singleton();
		}

		return Singleton.instance;
	}

	public someBusinessLogin() { ... }
}



function clientCode() {
	const s1 = Singleton.getInstance(); // 객체생성
	const s2 = Singleton.getInstance(); // s1에서 생성된 객체를 사용.

	if ( s1 === s2 ) {
		console.log('[singleton works] same instance');
	} else {
		console.log('[singleton failed] different instance');
	}
}

clientCode(); // [singleton works] same instance

 

- python3

class SingletonMeta(type):
	_instances = {}
	
	def __call__(cls, *args, **kwargs):
		if cls not in cls._instances:
			instance = super().__call__(*args, **kwargs)
			cls._instances[cls] = instance

		return cls._instances[cls]



class Singleton(metaclass=SingletonMeta):
	def some_business_logic(self):
		...


if __name__ == "__main__":

	s1 = Singleton()
	s2 = Singleton()
	
	if id(s1) == id(s2) :
		print("[singleton works] same instance")
	else:
		print("[singleton failed] different instance");

 

 

[ References] 

 

싱글톤(Singleton) 패턴이란?

이번 글에서는 디자인 패턴의 종류 중 하나인 싱글톤 패턴에 대해 알아보자. 싱글톤 패턴이 무엇인지, 패턴 구현 시 주의할 점은 무엇인지에 대해 알아보는 것만으로도 많은 도움이 될 것이라

tecoble.techcourse.co.kr

 

 

Singleton

Real-World Analogy The government is an excellent example of the Singleton pattern. A country can have only one official government. Regardless of the personal identities of the individuals who form governments, the title, “The Government of X”, is a g

refactoring.guru

 

728x90
반응형

'Backend > 꾸준히 TIL' 카테고리의 다른 글

[기본기] 네트워크 2  (0) 2023.04.29
[기본기] 네트워크 1  (0) 2023.04.29
[DB/MySQL] collate 예약어  (0) 2023.04.05
[IT 개념] HTTP 통신  (0) 2023.03.16
[IT 개념] CI와 CD 의미  (1) 2023.03.13
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함