싱글톤 패턴이란 객체의 인스턴스가 오직 1개만 생성되는 패턴을 의미한다.
싱글톤 패턴을 사용하는 이유는 최초 한번의 new 연산자를 통해 고정된 메모리 영역을 사용하기 때문에 추후 해당 객체에 접근할 때 메모리 낭비를 방지할 수 있고 이미 생성된 인스턴스를 활용하므로 속도 측면에서도 이점이 있다. 그리고 다른 클래스 간에 데이터 공유가 쉽다는 것이다. 싱글톤 인스턴스가 전역으로 사용되는 인스턴스이기 때문에 다른 클래스의 인스턴스들이 접근하여 사용할 수 있다. 하지만 여러 클래스의 인스턴스에서 싱글톤 인스턴스의 데이터에 동시에 접근하게 되면 동시성 문제가 발생할 수 있다.
첫번째 멀티스레딩 환경에서 동시성 문제를 겪을 수 있다. 동시성 문제 해결을 위해 동기적 처리를 해야한다.
그리고 두번째로 테스트하기 어렵다. 싱글톤 인스턴스는 자원을 공유하고 있기 때문에 테스트가 결정적으로 격리된 환경에서 수행되려면 매번 인스턴스의 상태를 초기화 시켜주어야 한다.
또한 자식클래스를 만들 수 없다는 단점이 있다.
새로운 인스턴스를 필요할 때 마다 매 번 생성할 필요가 없고, 필요하지 않을 때 인스턴스를 삭제할 필요가 없다.
constructor 메소드의 인자를 보면 클래스 또는 함수가 어떤 의존성을 갖는지 선언적으로 알 수 있다.
어떤 클래스에서든지 접근할 수 있도록 global scope를 가지도록 한다. 따라서 인스턴스가 실수로 더럽혀지는 것을 방지하기 위해 private readonly 플래그를 통해 의존성 주입을 선언한다.
Node.js는 싱글스레드로 작동하기 때문에 각각의 클래스 인스턴스들이 싱글톤으로 관리가 되어도 성능상에 문제가 없으며 동시에 안전하다.
나중에 scale out을 할 때에도, 노드 프로세스 마다 분리된 싱글톤 객체들을 갖기 때문에 확장에도 용이하다.
Singleton 의존성 주입을 위해서는 클래스를 인스턴스화 해야 하는데, Nest.js의 기본 설정으로 하나의 클래스는 오로지 하나의 인스턴스만을 가지도록 한다.
module을 사용해서 injection 하는 패턴이 싱글톤 패턴인데 직접 인스턴스들을 만드는 것이 아닌 모든 모듈은 싱글톤이기 때문에 다른 모듈에서도 서로를 export 해서 사용할 수 있다.
출처: https://tecoble.techcourse.co.kr/post/2020-11-07-singleton/
https://ganzicoder.tistory.com/163