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를 사용할 경우 위의 예와 같이 속성명과 값의 쌍으로 대입해야 하며, 함수를 직접 대입할 수는 없습니다.