싱글톤 이란 ?
싱글톤 패턴은 객체를 딱 하나만 생성하여 생성된 객체를 프로그램 어디에서나 접근하여 사용할 수 있도록 하는 패턴을 말합니다.

장점
- 메모리 낭비 방지
- 싱글톤으로 만들어진 Component 와 다른 Component 의 데이터 공유가 쉬움
- 인스턴스가 절대적으로 한개만 존재하는 것을 보증하기에 개발 시 실수를 줄일 수 있다.
단점
- 싱글톤의 역할이 커질수록 결합도가 높아져 객체 지향 설계 원칙에 어긋날 수 있다. 동시에 위험도 도 높아짐 ( 수정이 어려워 지고, 유지보수 하는게 어려워 질수 있음)
- 멀티쓰레드 환경에서 컨트롤이 힘듦 ( 동기화 처리 필수)
- 전역변수 보다 사용하기 불편
예시 적용
FancyLogger.js 생성 - singleton instance 생성 하는 class
class FancyLogger {
constructor() {
if (FancyLogger.instance == null) {
this.logs = []
FancyLogger.instance = this
}
return FancyLogger.instance
}
log(message) {
this.logs.push(message)
console.log(`FANCY: ${message}`)
}
printLogCount() {
console.log(`${this.logs.length} Logs`)
}
}
const logger = new FancyLogger()
Object.freeze(logger) // 외부 로 부터 해당 instance를 조정 하는 걸 방지함
export default logger
firstUse.js 생성 - singleton instance 를 implement 하는 첫번째 Function
import logger from './fancyLogger.js'
export default function logFirstImplementation() {
logger.printLogCount()
logger.log('First File')
logger.printLogCount()
}
ㄹ
secondUse.js 생성 - singleton instance 를 implement 하는 두번째 Function
import logger from './fancyLogger.js'
export default function logSecondImplementation() {
logger.printLogCount()
logger.log('Second File')
logger.printLogCount()
}
index.js 생성 - 첫번째, 두번째 Function 을 호출 함
import logFirstImplementation from './firstUse.js'
import logSecondImplementation from './secondUse.js'
logFirstImplementation()
logSecondImplementation()
결과

설명
index.js 호출 -> firstUse.js 호출 -> logger 호출 ( FancyLogger.js ) -> 첫 호출 이므로 (FancyLogger.instance == null ), FancyLogger instance ( singleton instance ) 생성 -> firstUse.js 에 Define 된 printLogCount() 2번 실행 -> 이후 secondUse.js 호출 -> logger 호출 ( FancyLogger.js ) -> 두번째 호출 이므로 FancyLogger.instance 생성 X -> 기존에 생성 된 Fancylogger instance 유지 & 사용.
- FancyLogger instance 는 최초 1번 생성 되고 이후, 다른 컴포넌트에서 해당 instance를 공유&접근&사용 한다.
Ref
https://www.youtube.com/watch?v=sJ-c3BA-Ypo&ab_channel=WebDevSimplified