본문 바로가기

nodejs

require()와 module.exports

노드의 모듈화를 이해하려면 require()와 module.exports를 알아야 한다. 웹 브라우져에서는 HTML의 <script> 태그로 필요한 자바스크립트 파일을 불러오고, 로딩된 자바스크립트는 서로 참조하거나 호출할 수 있다. 하지만 노드느 HTML 파일이 없이 자바스크립트 파일만 존재하기 때문에 서로 참조하고 호출하기 위한 방법이 필요하다. 이를 위해 노드는 require()와 module.exports를 사용한다. require()와 module.exports는 노드가 마음대로 정한 함수가 아닌 CommonJS의 모듈표준이다. 사실 이 두가지가 노드를 사용하기 위해 CommonJS에서 알아야 하는 내용 전부다.


노드에서 하나의 자바스크립트 파일은 하나의 모듈이 된다. 자바스크립트 파일에서 정의한 객체는 모두 외부에서는 접근할 수 없고 내부에서만 접근할 수 있는 지역 범위로 정의된다. 이는 클라이언트 자바스크립트에서 전역 범위의 네임스페이스를 침범하지 않으려고 (function(){})() 같이 익명 함수로 코드를 감싸는 방법과 같다. 실제로 노드는 각 자바스크립트 파일을 (function(){})()같은 익명 함수로 감싸 외부에서 접근할 수 없게 만든다. 그래서 외부에서 접근을 허용해야 하는 객체는 명시적으로 지정해야 한다. 함수나 변수를 module.exports에 할당하면 외부에서 접근할 수 있다. 모듈을 사용하는 파일에서는 require()로 다른 자바스크립트 파일을 불러와 module.exports로 허용된 변수나 함수를 사용한다. require()를 어떻게 사용하는지 먼저 살펴보자. 노드는 많은 기본 모듈을 제공하는데, 이 기본 모듈을 다음처럼 require()로 불러온다.


var filesystem = require('fs');

var util = require('util');


fs는 파일시스템 관련 기본 모듈이고, util은 유틸리티 함수를 제공하는 기본 모듈이다. 노드 내부를 보면 fs.js나 util.js 같은 자바스크립트 파일이 있다. 이 코드에서는 fs.js와 util.js로 제공되는 기본 모듈을 불러와 각 변수에 저장했다. 이제 코드에서 filesystem과 util 변수로 각 모듈의 함수를 사용한다. 여기서 사용한 것처럼 require()의 파라미터가 ./이나 ../처럼 상대 경로로 시작하지 않고 모듈명(자바스크립트 파일명)을 바로 사용하면 기본 모듈이나 확장 모듈을 불러온다.


직접 작성한 자바스크립트 파일 사이에서 서로 호출하는 방법은


// user_module.js

var something = module.exports = {};


// demo.js

var usermodule = require('./user_module');


user_module.js와 demo.js 두 개의 파일을 만들었다. user_module.js에서 정의한 객체를 module.exports에 할당해 외부에서 접근할 수 있게 만들었다. 그리고 demo.js에서 require('./user_module.js')로 user_module.js 파일을 불러와 usermodule 변수에 할당하면 something 변수와 같은 객체를 찹조한다. demo.js에서 require가 ./로 시작했으므로 기본 모듈이 아닌 현재 위치에서 모듈명의 js파일을 찾는다. js확장자는 적지 않아도 된다. 물론 찾는 이름의 모듈이 없으면 에러가 발생한다. module.exports는 다움 세 가지 방법이 모두 가능하다.


exports = {};

exports = something = {};

module.exports = {};


exports는 module.exports의 별칭이므로 이 세 가지는 기능상 완전히 같다. 선호하는 방식을 사용하면 된다. require()를 사용할 때 주의할 점은 require()로 불러진 파일은 노드 애플리케이션 내에서 캐싱된다는 점이다. 


출처 : NODE.JS 프로그래밍  변정훈 지음


https://github.com/outsideris/node.js-programming/tree/features/node-0.8




code_Node.js.zip


'nodejs' 카테고리의 다른 글

NTS 설치  (0) 2014.06.01
npm으로 package.json 생성하기  (0) 2014.04.23
NodeJS 한글 api  (0) 2012.08.28
Jade - 뷰 템플릿  (0) 2012.08.17
Node 코딩 관례  (0) 2012.08.16