Node.js
는 간단한 모듈 로딩 시스템을 갖고 있습니다. Node.js
에서 파일과 모듈은 일대일로 대응하며, 각 파일은 별도의 모듈로 처리됩니다. 그렇기 때문에 여러곳에서 하나의 파일에 작성된 모듈을 필요로 할 때 동일한 인스턴스를 사용할 수 있도록 합니다.
즉 모듈을 require
할 때마다 새로운 인스턴스가 생성되는 것이 아니라 캐싱된 객체 인스턴스를 재사용 하는 것 입니다.
Node.js
공식 Doc에서는 한번 Load(require)된 모듈은 require.cache
라는 객체에 캐싱됩니다. key 값으로 해당 모듈 파일의 경로를 갖게 되는데 key 값이 삭제 된다면 다음 require
요청시 다시 재로딩 하게 됩니다.
아래 예제를 참고하여 require.cache
에 캐싱된 모듈을 확인 할 수 있습니다.
// foo.js
module.exports = {
foo : "bar"
};
// index.js
let foo = require('./foo');
console.log('---------- require.cache ----------')
console.log(require.cache);
console.log('---------- require.cache keys ----------')
console.log(Object.keys(require.cache));
위 코드를 실행한 결과는 아래와 같습니다.
---------- require.cache ----------
[Object: null prototype] {
'/Users/knowre/Desktop/Yunmin/WebDevCurriculum/Part 3. node.js/Quest 10. Hello, node.js/skeleton/index.js': Module {
id: '.',
path: '/Users/knowre/Desktop/Yunmin/WebDevCurriculum/Part 3. node.js/Quest 10. Hello, node.js/skeleton',
exports: {},
filename: '/Users/knowre/Desktop/Yunmin/WebDevCurriculum/Part 3. node.js/Quest 10. Hello, node.js/skeleton/index.js',
loaded: false,
children: [ [Module] ],
paths: [
'/Users/knowre/Desktop/Yunmin/WebDevCurriculum/Part 3. node.js/Quest 10. Hello, node.js/skeleton/node_modules',
'/Users/knowre/Desktop/Yunmin/WebDevCurriculum/Part 3. node.js/Quest 10. Hello, node.js/node_modules',
'/Users/knowre/Desktop/Yunmin/WebDevCurriculum/Part 3. node.js/node_modules',
'/Users/knowre/Desktop/Yunmin/WebDevCurriculum/node_modules',
'/Users/knowre/Desktop/Yunmin/node_modules',
'/Users/knowre/Desktop/node_modules',
'/Users/knowre/node_modules',
'/Users/node_modules',
'/node_modules'
]
},
'/Users/knowre/Desktop/Yunmin/WebDevCurriculum/Part 3. node.js/Quest 10. Hello, node.js/skeleton/foo.js': Module {
id: '/Users/knowre/Desktop/Yunmin/WebDevCurriculum/Part 3. node.js/Quest 10. Hello, node.js/skeleton/foo.js',
path: '/Users/knowre/Desktop/Yunmin/WebDevCurriculum/Part 3. node.js/Quest 10. Hello, node.js/skeleton',
exports: { foo: 'bar' },
filename: '/Users/knowre/Desktop/Yunmin/WebDevCurriculum/Part 3. node.js/Quest 10. Hello, node.js/skeleton/foo.js',
loaded: true,
children: [],
paths: [
'/Users/knowre/Desktop/Yunmin/WebDevCurriculum/Part 3. node.js/Quest 10. Hello, node.js/skeleton/node_modules',
'/Users/knowre/Desktop/Yunmin/WebDevCurriculum/Part 3. node.js/Quest 10. Hello, node.js/node_modules',
'/Users/knowre/Desktop/Yunmin/WebDevCurriculum/Part 3. node.js/node_modules',
'/Users/knowre/Desktop/Yunmin/WebDevCurriculum/node_modules',
'/Users/knowre/Desktop/Yunmin/node_modules',
'/Users/knowre/Desktop/node_modules',
'/Users/knowre/node_modules',
'/Users/node_modules',
'/node_modules'
]
}
}
---------- require.cache keys ----------
[
'/Users/knowre/Desktop/Yunmin/WebDevCurriculum/Part 3. node.js/Quest 10. Hello, node.js/skeleton/index.js',
위 결과에서 확인할 수 있듯이 require.cache
객체는 key 값으로 해당 모듈 파일의 경로를 사용하여 모듈을 캐싱하고 있습니다.
이제 require
를 통해 모듈을 로딩할 경우 파일의 경로를 캐시 키로 사용하여 다른 여러 파일에서 동일한 파일을 필요로하는 경우 동일한 캐싱 된 모듈을 사용하는 것을 알 수 있었습니다.
이로인한 장점은 불필요한 메모리 사용을 피할 수 있습니다. 한번 로딩된 후 재사용되기 때문에 싱글톤과 같이 동작하는 것과 비슷합니다. 하지만 이러한 모듈의 캐싱 방식은 아래와 같은 단점이 존재합니다.