본문 바로가기

Design Pattern/Singleton

Design Pattern - Singleton 초간단 설명

싱글톤 이란 ?

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

 

 

장점

  1. 메모리 낭비 방지
  2. 싱글톤으로 만들어진 Component 와 다른 Component 의 데이터 공유가 쉬움
  3. 인스턴스가 절대적으로 한개만 존재하는 것을 보증하기에 개발 시 실수를 줄일 수 있다.

단점

  1. 싱글톤의 역할이 커질수록 결합도가 높아져 객체 지향 설계 원칙에 어긋날 수 있다. 동시에 위험도 도 높아짐 ( 수정이 어려워 지고, 유지보수 하는게 어려워 질수 있음)
  2. 멀티쓰레드 환경에서 컨트롤이 힘듦 ( 동기화 처리 필수)
  3. 전역변수 보다 사용하기 불편

 

예시 적용

 

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