Node.js에서 singleton을 구현하려하지 마세요
당신은 하지 않아도 될 코드를 생성하고 있을지도 모릅니다
  • JavaScript

Singleton 이란?

싱글톤 패턴이란, 전체 시스템에서 하나의 인스턴스만이 존재하도록 보장하는 객체 생성패턴입니다.
(자세한건 이 글에서 자세히 다룬다)

Node.js에서 싱글톤 구현

아마도 Node.js 에서 class를 사용하면서 싱글톤을 구현하기 위해 똑같지는 않더라도 비슷한 방식으로 구현했을 것이다.

class Foo {
  static instance;
  constructor() {
    if (!instance) {
      instance = this;
    }
  }
  
  getInstance() {
    return instance;
  }
};

const bar = Foo().getInstance();
const qaz = Foo().getInstance();

console.log(bar === qaz); // true

싱글톤 구현을 위해 위와같은 코드를 사용하고있었다면 당신은 쓸모없는 코드를 작성하고있었을지도 모른다.
다른 언어라면 모르겠지만 최소한 Node.js에서는 싱글톤을 직접 구현할 필요가 없다.

Node.js에서 require는 자동으로 캐시된다.

Node.js는 모듈이 처음 로드된 후 캐시된다. 즉, require('foo')를 하는순간 require.cache에 저장되고 이는 자동으로 캐시되어 다시 require를 하더라도 같은 객체가 반환된다.

즉,

const foo1 = require('foo');
const foo2 = require('foo');

console.log(foo1 === foo2); // true

위와같은 결과를 확인할 수 있다. (Node.js 공식문서 확인하기)

따라서 싱글톤의 코드를 구현하지 않더라도 알아서 싱글톤으로 동작하고 있었다는 의미이다.

주의사항

이것은 require('foo')가 동일한 파일로 해석되는 경우 동일한 객체가 리턴된다는 것을 의미한다.
그 말은 동일한 파일이 아니라면 다른 객체가 리턴된다.

모듈은 대소문자를 구분하여 node_modules의 위치에 따라 다른 파일이름으로 해석될 수 있으므로 다른 파일로 해석될 가능성이 있다.
require('foo')require('FOO') 는 비록 같읕 파일이라 할지라도 파일명이 다르면 다른 객체가 반환된다.

참고