Node.js 모듈 시스템
모듈은 자바스크립트 패키지를 만들고 자바스크립트 코드를 네임스페이스로 구분하는 메커니즘입니다. 모듈을 이용하면 특정한 기능을 하는 함수나 객체를 패키지화 해서 재사용할 수 있도록 할 수 있으며, 기능에 따라 코드를 분리하여 프로젝트를 구조화 할 수 있게 해줍니다.
모듈 작성
노드에서 모듈은 module.exports
문법을 사용해 만들고 내보낼 수 있습니다.
// sum.js
module.exports = sum = (a, b) => {
return a + b;
}
sum.js 파일을 만들고 module.exports
에 sum 함수를 대입했습니다. 이제 다른 파일에서 이 파일을 불러와 사용할 수 있게 되었습니다.
모듈 사용
모듈을 불러와 사용하기 위해서는 require
함수를 사용하게 됩니다.
// index.js
const sum = require("./sum");
console.log(sum(1, 2));
index.js 파일을 만들고 require
함수를 사용해 index.js파일과 동일한 폴더에 작성한 sum.js 함수를 불러왔습니다. 예시에서 보듯 파일 경로에 js 파일 확장자는 생략할 수 있습니다.
이제 불러온 모듈을 통해 index.js 파일에는 정의되어 있지 않은 sum()
함수를 사용할 수 있게 되었습니다.
모듈 구성
모듈에는 함수외에도 객체나 변수 등을 할당하여 재사용할 수 있으며, 사용방법은 거의 유사합니다.
함수모듈 예시
// calc.js
function calculate(a, b) {
return a * b;
}
module.exports = calculate;
// app.js
const calc = require('./calc.js');
calc(2, 3); // 6
객체 모듈 예시
// calc.js
module.exports = {
geometricSum(a, b, c) {
return a * b * c;
},
arithmeticSum(n) {
return n + 1;
}
}
// app.js
const calc = require('./calc.js');
calc.geometricSum(1, 2, 3);
여러 함수를 exports 하기
// my_module.js
var foo = function() {};
var bar = function() {};
var private = function() {};
// private 함수는 외부로 노출시키지 않았습니다. 이렇게 할 경우
// private 함수는 모듈 내부에서만 사용되는 private 함수로 사용할 수도 있습니다.
exports.foo = foo;
exports.bar = bar;
// app.js
var myMod = require('./my_module');
myMod.foo();
myMod.bar();
module.exports === exports
module.exports 대신 exports 를 사용할 수 도 있습니다. 둘 다 같은 객체를 참조하기 때문입니다. 하지만 exports를 사용할 경우 위의 예와 같이 속성명과 값의 쌍으로 대입해야 하며, 함수를 직접 대입할 수는 없습니다.