게시글

5만명이 선택한 평균 별점 4.9의 제로초 프로그래밍 강좌! 로드맵만 따라오면 됩니다! 클릭
강좌16 - NodeJS - 8년 전 등록 / 6년 전 수정

Node 모듈 시스템

common.js

안녕하세요. 이번 시간에는 Node.js 모듈 시스템에 대해 알아보겠습니다.

우선 모듈은 독립적인 하나의 소프트웨어입니다. Node.js는 파일 하나하나가 모듈로 기능하는데요. 브라우저에서는 script 태그로 스크립트를 불러오면 다른 스크립트에서도 이전 스크립트의 변수를 사용할 수 있었지만, Node.js는 명시적으로 이전 스크립트의 변수를 사용하겠다고 선언해주어야 합니다. 이러한 특성 때문에 Node.js에서는 모듈 시스템을 이해하는 것이 중요합니다.

요즘 ES2015가 대세라서 ES2015의 모듈 시스템을 사용해본 분들이 많을텐데요. Node.js의 모듈 시스템은 비슷하긴 하지만 조금 다릅니다. Node.js 버전 6부터는 ES2015를 지원하긴 하지만 하나 도입하지 않은 게 바로 ES2015의 모듈 시스템입니다(이제는 실험적인 기능으로 지원합니다). 아마도 Node.js는 자신의 모듈 시스템(common.js)을 그대로 가져갈 모양입니다. 

지금까지 Node.js에서 모듈을 만들 때 module.exports를 사용했었죠? 대표적인 모듈 생성 방법입니다. 하지만 사실 모듈을 만드는 방법이 하나 더 있습니다. 이번 시간에는 그 방법에 대해서도 알아보겠습니다.

calc.js

function add(a, b) {
  return a + b;
}
module.exports = add;

main.js

const add = require('./calc.js');
console.log(add(1, 2)); // 3

위의 calc.js는 흔히 볼 수 있는 모듈입니다. add 함수가 여러 번 재사용 될 때, 개별적인 파일로 만들고 마지막에 다른 파일에서 사용할 변수를 module.exports에 대입해주면 됩니다. 파일 하나가 모듈 하나의 역할을 하게 됩니다. 저렇게 모듈로 만들면 쉽게 재사용할 수 있죠. 다른 파일(main.js)에서는 해당 파일 경로를 require 해주면 calc.js의 add 함수를 사용할 수 있습니다..

만약 calc.js에 빼기나 곱하기, 나누기같은 기능들을 추가하고 싶다면 어떻게 해야 할까요?

calc.js

function add(a, b) {
  return a + b;
}

function substract(a, b) {
  return a - b;
}

function multiply(a, b) {
  return a * b;
}

function divide(a, b) {
  return a / b;
}

module.exports = {
  add: add,
  substract: substract,
  multiply: multiply,
  divide: divide,
};

main.js

const add = require('./calc.js').add;
const multiply = require('./calc.js').multiply;

console.log(multiply(add(1,2), add(2,3)); // 15

하면 됩니다. 객체를 만들어서 안에 내보내고 싶은 것들을 넣고 통째로 export하는 겁니다. require을 하게 되면 객체를 통째로 가져오기 때문에 따로 .add나 .multiply로 속성에 접근해야 합니다. 그런데 위와 비슷하지만 조금 다른 방법이 있습니다. 바로 exports 객체를 사용하는 방법입니다.

calc.js

exports.add = function(a, b) {
  return a + b;
};

exports.substract = function(a, b) {
  return a - b;
};

exports.multiply = function(a, b) {
  return a * b;
};

exports.divide = function(a, b) {
  return a / b;
};

main.js는 이전과 같습니다. exports를 사용해 따로따로 추가할 수 있습니다. 사실 exports는 module.exports와 같습니다. 참조 관계이기 때문이죠. 하지만 주로 module.exports는 한 번에 export할 때 사용하고, exports는 여러 개의 객체를 따로 export할 때 사용합니다. 문법적 특성 때문입니다.

주의해야 할 점은 exports 자체에는 절대로 다른 값을 대입하면 안 된다는 겁니다. 항상 exports 객체의 속성에 값을 넣어주어야 합니다.

exports = divide;

이렇게 하는 순간 더는 모듈로 기능하지 않습니다. exports는 module.exports참조하고 있는데 다른 것을 대입해버리면 참조 관계가 깨지기 때문이죠. exports는 속성으로 추가할 때만 사용해야 합니다.

ES2015는 위와 개념은 비슷하지만 문법이 조금 달라졌습니다. 아쉽게도 Node.js에서는 ES2015 모듈은 사용하지 못 합니다. ES2015 모듈 시스템에 대해 알고싶으시면 이 강좌 를 참고하세요!

조회수:
0
목록
투표로 게시글에 관해 피드백을 해주시면 게시글 수정 시 반영됩니다. 오류가 있다면 어떤 부분에 오류가 있는지도 알려주세요! 잘못된 정보가 퍼져나가지 않도록 도와주세요.
Copyright 2016- . 무단 전재 및 재배포 금지. 출처 표기 시 인용 가능.
5만명이 선택한 평균 별점 4.9의 제로초 프로그래밍 강좌! 로드맵만 따라오면 됩니다! 클릭

댓글

10개의 댓글이 있습니다.
5달 전
안녕하세요! 지금 『Node.js 교과서』로 백엔드의 기초를 배우고 있는 학생입니다. 도서 내용 관련해 질문이 하나 있어서 댓글 남깁니다.
제가 실수로 개정판을 구매하지 않은 탓에 다소 오래된 내용으로 배우게 됐습니다. 그래서 express-generator를 사용하며, 이 패키지가 아직 ES Module을 지원하지 않음을 알게 되었습니다.
ES Module을 사용하는 게 문법적으로나 ESLint와의 호환성 면으로나 더 도움이 될 것 같은데요... 혹시 이를 보완하는 express-generator에 대한 대안이 있을까요?
5달 전
브라우저쪽이면 몰라도 노드쪽에서는 ES Module 아직 안 쓰시는 게 좋습니다. 대다수의 라이브러리가 아직도 CommonJS입니다. ES Module 썼다가 import나 require 안 되는 경우 허다합니다. 참고로 express-generator도 이제는 거의 안 씁니다. 저는 그냥 처음부터 express 세팅하거나(코드 별로 안 됩니다), nest.js를 주로 씁니다.
5달 전
참고하겠습니다. 빠른 답변 감사드립니다!
4년 전
app.js에서 ejs파일의 자바스크리트 코드내의 함수를 실행할수도 있나요..? ejssk html파일의 자바스크립트 파일도 모듈화를 하려고 하는데 가능할까요..? app.js의 라우터에서 데이터를 보내줘야하는데 어떻게 해야할지 모르겠습니다...
4년 전
app.js에서 ejs 파일의 함수를 직접 실행할 수는 없고요 \u003c%= %>로 함수를 감싼 if 문 조건을 true로 만든다든지 해서 간접적으로 실행할 수는 있습니다.
4년 전
es6이 표준인데 노드js는 표준을 따르지 않은 것이라고 보면 되나요?
4년 전
es6 모듈이 나오기 이전부터 노드는 common.js를 쓰고 있었습니다.
5년 전
안녕하세요 질문이 있습니다.
1. 모듈로더란 ? commonjs, amd을 사용하여 정의한 javascript 모듈을 로드/해석 및 실행 할 수 있는 라이브러리라고 알고 있습니다. 그런데 프론트쪽 import/export같은 모듈 시스템도 모듈로더라고 하나요?
2. 모듈의 등장에 대한 질문입니다. IIFE 개념이 항상 나오더라구요. 모듈시스템을 나오기전에 전역의 오염을 피하기 위해 IIFE을 써서 피했다고 생각하면 될까요?
5년 전
1. 아뇨 그냥 모듈 시스템이라 합니다.
2. 네 예전에는 IIFE로 스코프를 구분하거나 네임스페이싱을 했습니다.
6년 전
항상잘보고잇습니다.
7년 전
서버를 node가아닌 자바를쓸때는 ES6 스크립팅을할떄 require랑 module.exports등을 쓰면안되는거지요 ? 자바서버코드 와 프론트를 머지했을때 안될거같은데
7년 전
프론트 es6의 모듈 시스템이 따로 있습니다. import export요. 하지만 이것도 최신브라우저에서만 돌아갑니다.
7년 전
네 그래서 babel-loader를 사용하면 구버전에서도 돌아가게 스크립팅이되는걸로아는데 그부분까지는 혹시 커버가안되는건가요 ? 화살표기법같은것만 되는건지. 프론트엔드로전향한지 일주일밖에안되서 모르는게너무많네요
만약 익스플로러8같이 구버전을지원해야한다고하면 import,export와 노드 둘다안되고 옛날방식으로해야하나요 ?
7년 전
바벨만으로는 안 되고 웹팩으로 하면 가능합니다. 웹팩으로 하면 require이나 import 중에 자유롭게 고를 수도 있고요. 바벨로더 보니까 웹팩 쓰시는 것 같네요. 웹팩으로 나온 output 파일을 script src로 html에 붙이면 됩니다.
5년 전
babel을 쓰고나서 script에 type=module을 쓰면 사용되지 않나요?
7년 전
exports.변수/함수명 과 module.exports = XX /// 차이가 궁금했는데.. 결국 사용방법의 차이이군요.ㅠ.ㅠ // 잘 보고 갑네당..
7년 전
안녕하세요?
앞으로 express로 조그만한 개인 프로젝트 해볼 생각입니다.
다른 웹 프레임워크들은 정형화된 mvc 패턴 구조가 있는데 express만의 자주 사용하는 mvc 패턴 구조가 있을까요?
찾아보니 express generator라는 것이 있는데 개인 사용자들뿐만 아니라 기업에서도 사용하는지 궁금합니다.
감사합니다.
7년 전
익스프레스는 그냥 노드하는 사람은 거의 다 쓴다고 보시면 됩니다. 코아랑 하피도 있는데 거의 안 쓰고요. 구조는 워낙 자유라 정해진 건 없지만 제너레이터 구조 많이 씁니다.
8년 전
마지막까지 잘봤습니다 ㅎㅎ 기사시험이랑 하느라 시간이좀 걸렸네여 ㅎ
8년 전
node.js 강좌는 여기가 마지막인가요?
8년 전
더 써야 하는데 소재 고갈이네요 ㅠㅠ 어떤 게 더 있을까요