싱글톤 패턴

2024년 2월 29일

image

Singleton Pattrern

1회에 한하여 인스턴스화가 가능하며 전역에서 접근 가능한 클래스

인스턴스를 단 한 번만 만들 수 있어야 한다.

앱 전역에서 공유되기 때문에 앱 전역 상태 관리를 관리하기 적합

zustand와 contextAPI 같은 상태 관리를 할 때 필요한 도구처럼 사용될 수 있다.

여기서 해당 클래스가 한 번 인스턴스로 만들어졌는지 확인하기 위해서는 따로 변수를 선언해주어야 한다. (instance 변수)

let instance

class Singleton{
	constructor() {
		if(instance) {
			throw new Error("이미 하나의 인스턴스가 존재합니다.")
		}
		instance = this 
	}
	
	// ...
}

이후에 해당 인스턴스를 freeze 하면서 직접 객체를 수정할 수 없도록 해야 한다. Object.freeze(new 클래스())

단점

  • 인스턴스를 하나만 만들면 메모리 공간을 절약할 수 있지만, 매번 새로운 인스턴스를 만들어야 하므로 자바스크립트에서는 싱글톤 패턴 사용을 지양하는 추세이다.
  • JAVA와 C++의 경우에는 클래스 없이도 직접 객체를 만들 수 있는 자바스크립트와는 다르기 때문에 반드시 객체를 만들기 위해서는 클래스를 작성해야 한다.
  • 다른 디자인 패턴처럼 싱글톤 패턴도 마찬가지로 테스트를 진행하는 것이 까다롭다. 왜냐하면 인스턴스를 매번 생성할 수 없기 때문이다. 하나의 테스트가 끝나면 인스턴스의 변경사항을 초기화 해 주어야 하기 때문에 번거롭기도 하고 테스트 실행 순서의 작은 수정 사항이 생긴다면 테스트 실패로 이어질 수 있다.
  • 의존성이 명확하지 않다.
  • 싱글톤 패턴의 인스턴스는 앱 전체에서 참조할 수 있어야 하기 때문에 전역적으로 접근이 가능하다. 따라서 앱의 규모가 커지고 전역 상태를 참조하는 컴포넌트가 많아지면 데이터 흐름을 파악하기 어려워진다.

활용 방법

  • React의 전역 상태 관리를 위해 싱글톤 패턴을 사용할 수 있다. Redux나 ContextAPI 대신 활용할 수 있다.