이 블로그는 광고 클릭 수익으로 운영됩니다!
괜찮으시다면 광고 차단을 풀어주세요 ㅠㅠ

게시글

강좌16 - NodeJS - 2년 전 등록 / 일 년 전 수정

Node 모듈 시스템

조회수:
0
이 블로그는 광고 클릭 수익으로 운영됩니다!
괜찮으시다면 광고 차단을 풀어주세요 ㅠㅠ
이 블로그는 광고 클릭 수익으로 운영됩니다!
괜찮으시다면 광고 차단을 풀어주세요 ㅠㅠ

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

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

요즘 ES2015가 대세라서 ES2015의 모듈 시스템을 사용해본 분들이 많을텐데요. Node.js의 모듈 시스템은 비슷하긴 하지만 조금 다릅니다. Node.js 버전 6부터는 ES2015를 지원하긴 하지만 하나 도입하지 않은 게 바로 ES2015의 모듈 시스템입니다. 아마도 Node.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 모듈 시스템에 대해 알고싶으시면 이 강좌 를 참고하세요!

투표로 게시글에 관해 피드백을 해주시면 많은 도움이 됩니다. 오류가 있다면 어떤 부분에 오류가 있는지도 알려주세요! 잘못된 정보가 퍼져나가지 않도록 도와주세요.
Copyright © 2016- 무단 전재 및 재배포 금지

댓글

5개의 댓글이 있습니다.
3달 전
서버를 node가아닌 자바를쓸때는 ES6 스크립팅을할떄 require랑 module.exports등을 쓰면안되는거지요 ? 자바서버코드 와 프론트를 머지했을때 안될거같은데
3달 전
프론트 es6의 모듈 시스템이 따로 있습니다. import export요. 하지만 이것도 최신브라우저에서만 돌아갑니다.
3달 전
네 그래서 babel-loader를 사용하면 구버전에서도 돌아가게 스크립팅이되는걸로아는데 그부분까지는 혹시 커버가안되는건가요 ? 화살표기법같은것만 되는건지. 프론트엔드로전향한지 일주일밖에안되서 모르는게너무많네요
만약 익스플로러8같이 구버전을지원해야한다고하면 import,export와 노드 둘다안되고 옛날방식으로해야하나요 ?
3달 전
바벨만으로는 안 되고 웹팩으로 하면 가능합니다. 웹팩으로 하면 require이나 import 중에 자유롭게 고를 수도 있고요. 바벨로더 보니까 웹팩 쓰시는 것 같네요. 웹팩으로 나온 output 파일을 script src로 html에 붙이면 됩니다.
3달 전
exports.변수/함수명 과 module.exports = XX /// 차이가 궁금했는데.. 결국 사용방법의 차이이군요.ㅠ.ㅠ // 잘 보고 갑네당..
6달 전
안녕하세요?
앞으로 express로 조그만한 개인 프로젝트 해볼 생각입니다.
다른 웹 프레임워크들은 정형화된 mvc 패턴 구조가 있는데 express만의 자주 사용하는 mvc 패턴 구조가 있을까요?
찾아보니 express generator라는 것이 있는데 개인 사용자들뿐만 아니라 기업에서도 사용하는지 궁금합니다.
감사합니다.
6달 전
익스프레스는 그냥 노드하는 사람은 거의 다 쓴다고 보시면 됩니다. 코아랑 하피도 있는데 거의 안 쓰고요. 구조는 워낙 자유라 정해진 건 없지만 제너레이터 구조 많이 씁니다.
일 년 전
마지막까지 잘봤습니다 ㅎㅎ 기사시험이랑 하느라 시간이좀 걸렸네여 ㅎ
일 년 전
node.js 강좌는 여기가 마지막인가요?
일 년 전
더 써야 하는데 소재 고갈이네요 ㅠㅠ 어떤 게 더 있을까요