싱글톤 패턴이란, 전체 시스템에서 하나의 인스턴스만이 존재하도록 보장하는 객체 생성패턴입니다.
(자세한건 이 글에서 자세히 다룬다)
아마도 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('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')
는 비록 같읕 파일이라 할지라도 파일명이 다르면 다른 객체가 반환된다.