[NodeJS] 모듈, 캐싱 그리고 exports

2017. 11. 8. 14:23JavaScript/NodeJS

1. 사용자 모듈 생성


모듈은 java나 C의 라이브러리라고 보면 된다.


모듈은 javascript 파일 단위로 구현이 되며 해당 파일 안에서 exports를 해야만 사용이 가능하다.


가장 기본적인 구조는 다음과 같다.


// calc.js

function add(a, b) {

return a + b;

}


module.exports = add;



이와 같이 하여  사용시에는 require 하여 사용하면 됩니다.


var add = require("./calc");

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



이를 확장하여 javascript 파일 하나에 여러개의 기능을 추가하고 싶을 경우는


//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

};


이와 같이 작성을 하면 된다.


위의 소스 에서 module.export 할 때 형태를 다음과 같이 개별로 구분하여도 상관은 없다.


exports.add = add;

exports.substract = substract ;

exports.multiply= multiply;

exports.divide= divide;


단일 함수를 사용할 경우에는 module를 삭제해도 상관이 없다. 그러니까 여러 객체를 따로 exports 할 때만 사용한다.

이러한 방식으로 사용할 경우 exports에 바로 다른 값을 대입하면 안된다는 것이다.


exports = add;


이렇게 작업을 함과 동시에 NodeJS는 제대로 기능을 하지 않는다.




또 다른 방법으로는 


//calc2.js

module.exports = function(a, b) {


return {

add : function(){

return a + b;

},


substract : function() {

return a - b;

},


multiply : function() {

return a * b;

},


divide : function() {

return a / b;

}

};

};


이와 같이 작성을 하여도 된다.

하지만 위와 같이 작성하였을 경우에는 초기화 작업이 한번 들어가야 한다.

사용법은 아래와 같다.


var calc2 = require("./calc2");


var myCalc = calc2(1, 2);

console.log( myCalc.add() );     // 3




2. 파일 모듈 로딩


파일 모듈 로딩은 코어 모듈 로딩, 파일 모듈 로딩 방식과 폴더 모듈 로딩 방식이 있다.

말 그대로 파일모듈로딩은 파일을 폴더 모듈로딩은 폴더의 파일들을 묶어서 로딩할 수 있는 Java의 package와 같다고 보면 된다.


- 코어 모듈 로딩


코어 모듈은 NodeJS에서 제공하는 모듈이다.

코어 모듈은 경로가 아닌 모듈명 참조로 로딩하며 같은 이름의 서드파티 모듈이 존재하다라도 우선적으로 로드된다.


var http = require("http");


코어 모듈은 API를 참조 하면 된다.


- 파일 모듈 로딩


파일 모듈은 코어 모듈이 아닌 모듈로서 로딩시 절대 경로 또는 상대경로로 지정하여 로딩한다.


//절대 경로

var myModule = require("/home/nodejsDir/mymodule");


//상대 경로

var myModule2 = require("./nodejsDir/mymodule");

var myModule3 = require("./nodejsDir/mymodule.js");


이와 같이 로딩되며 로딩할 때 확장자인 .js는 생략해도 무관하다.


만약 js가 생략되었을 경우 우선적으로 해당 명칭의 모듈 파일을 로딩하고 없으면 폴더를 검색하게 된다.




- 폴더 모듈 로딩


폴더 모듈로딩은 폴더의 파일들을 묶어서 로딩할 수 있는 Java의 package와 같다고 보면 된다.


var myModuleDir = require("./nodejsDir");


이렇게 선언하면 해당 폴더 내의 모듈을 찾는다.

NodeJS는 이 폴더를 package라고 판단을 하여 package.json 파일을 찾는다.


해당 폴더에 package.json 파일이 없으면 package의 기본 모듈인 index.js 또는 index.node를 찾는다.



packate.json는 아래와 같이 작성할 수 있다.


{

"name" : "calc",

"main" : "./calc.js"        //nodejsDir에 있다고 가정한다.

}




3. 모듈 캐싱


모듈은 처음 로딩 될때 캐싱된다.

결과적으로 한번만 로딩이 되어 여러번 호출 한다해도 반환되는 모듈은 항상 동일하다.


//mymodule.js

console.log("myModule 시작");

module.exports = function() {

console.log( "myModule 호출");

};

console.log("myModule 끝");


위의 모듈을 로딩하고 나면 


var myModule = require("./mymodule");


다음과 같이 결과가 출력된다.


myModule 시작

myModule 끝


그럼 다음과 같이 두번 호출 한다고 해보자


var myModule1 = require("./mymodule");

var myModule2 = require("./mymodule");


그래도 결과는 


myModule 시작

myModule 끝


반복하여 출력하는 것이 아니라 한번만 출력이 되는 것을 확인 할 수 있을 것이다.


이는 해당 모듈은 초기화가 한번만 일어난다는 의미임을 알 수 있다.