본문 바로가기
Javascript/Node.js

Singleton Pattern - 생성자 디자인 패턴

by v8rus 2022. 2. 3.

싱글톤(Singleton)

"인스턴스가 하나만 존재하도록 접근을 중앙 집중화"

객체지향에서 가장 많이 사용

Node 에서 논의할 가치가 없지만 알아두면 좋음
Node개발자가 알아둬야 할 몇가지 주의사항과 제약사항 존재

  1. 상태 정보의 공유
  2. 리소스 사용의 최적화
  3. 리소스에 대한 접근 동기화

Ex) 데이터 베이스에 대한 접근을 제공하는 일반적인 DB 클래스

// Database.js
export class Databse {
  constructor (dbName, connectionDetails) {
    // ...
  }
  // ...
}
  • 전형적인 구현은 일반적으로 연결풀 (connection pool)을 유지함
      => 각 요청에 대해 새로운 DB 인스턴스를 만들 필요 없음
  • DB 인스턴스는 대기중인 트랜잭션 목록 같은 일부 상태 정보를 가짐

위의 두가지 기준을 완벽하게 충족
시작 시 하나의 DB 인스턴스를 설정하고 만들어 모든 컴포넌트가 하나의 DB 인스턴스를 공유

 

Node의 모듈에서 인스턴스를 익스포트 하는것만으로 싱글톤 패턴과 유사하게 동작

// dbInstance.js
import { Database } from './Database.js';

export const dbInstance = new Database('sampleDb', {
  url : ...,
  username : ...,
  password : ...,
})

// 다른곳에서 공유된 인스턴스 불러오기
import { dbInstance } from './dbInstance.js'

새로운 인스턴스를 내보내는것으로 해당 인스턴스가 하나만 존재한다고 가정함
Node 는 모듈을 캐시하여 불러올때마다 코드를 다시 읽어들이지 않음

다만 주의할 점!
모듈은 전체경로를 키로 하여 캐시됨 => 싱글톤 보장
각 패키지는 자신의 node_modules 디렉터리 내에 자체적인 일련의 종속성을 가져 고유성 보장하지 못함
패키지마다 다른 버전의 종속성을 가지면 두개의 인스턴스를 생성해버림 (드문 일)
이 경우 중복 패키지를 최상위 node_modules 디렉터리에 설치함, 종속성 호이스팅 (dependency hoisting)

다음과 같이 명시적으로 글로벌 변수를 사용하지 않는 한, 위에 기술한 대로 싱글톤 패턴은 Node 에 존재하지 않는다는것을 쉽게 이해 할 수 있지...

global.dbInstance = new Databse ('sampleDB', {...});


이렇게 하면 인스턴스가 패키지 내에서가 아닌 전체 어플리케이션에서 공유되는 유일한 인스턴스임을 보장
다만, 대부분 필요하지 않으며 최악의 경우 이렇게 사용

댓글