파일(모듈) 분리하기





exports를 이용하여 모듈화 하는 방법

Node 개발시 어플리케이션 소스코드를 분석 및 관리를 쉽게 하기 위해 역할별로 관련된 함수들을 파일 단위로 분리하여 사용하는데 이때 이 파일들을 모듈이라 합니다.
CommonJS 표준에 따라 다음과 같이 모듈을 이용할 수 있습니다.
함수를 모듈로 분리하고 등록해주는 방법으로 Node 어디서나 사용 가능한 전역객체인 exports에 개발한 함수(Function)를 할당합니다.
그리고 분리된 모듈을 불러오는 방법으로는 마찬가지로 전역 함수인 require() 함수를 이용합니다.

두 파일이 상대경로상 같은 디렉터리 안에 위치하는 경우 다음과 같이 모듈로 등록하고 불러올 수 있습니다.

calcModule.js
exports.add = function(arg1 , arg2){
    return arg1 + arg2;
}

main.js

var calc = require('./calcModule');
console.log(calc.add(1,3)); //4


require() 함수에 js 확장자를 뺀 파일의 상대경로를 인자로 넘겨주면 해당 모듈이 경로상에 있는지 확인하여 불러옵니다.
만약 해당 경로에 해당하는 파일이 없다면 폴더명으로 인식하여 찾아 폴더 안에 있는 파일들을 불러옵니다.
또한 해당 모듈 안에서도 다른 모듈을 불러올 수 있으며, 그 모듈 또한 안에서 또 다른 모듈을 불러올 수 있습니다.
이렇게 모듈이 사용하는 대상 모듈을 의존 모듈이라 하는데 Node에서의 모듈들은 서로 사슬처럼 얽혀 있습니다.

다음의 소스들을 main에서부터 시작해서 유추하면서 따라가보시면 이해가 될 것입니다.
주의할 점이 있다면 모듈을 로딩하는 시점과 로딩한 모듈안의 함수를 실행하는 시점이 다르다는 점입니다.

calcModule.js
console.log('calcModule.js 실행');
exports.add = function(arg1 , arg2){
    console.log('calcModule.js add() 실행');
    return arg1 + arg2;
};
console.log('calcModule.js 종료');


calcModule2.js
console.log('calcModule2.js 실행');
exports.add2 = function(arg1, arg2){
    console.log('calcModule2.js add2() 실행');
    
    var calc = require('./calcModule');
    console.log('calcModule 로딩 완료');
    
    return calc.add(arg1, arg2);
};
console.log('calcModule2.js 종료');

main.js 
console.log('main.js 시작')
var calc2 = require('./calcModule2');
console.log('main.js에서 calc2.add() 호출 ' + calc2.add2(1,3));

결과 
main.js 시작
calcModule2.js 실행
calcModule2.js 종료
calcModule2.js add2() 실행
calcModule.js 실행
calcModule.js 종료
calcModule 로딩 완료
calcModule.js add() 실행
main.js에서 calc2.add() 호출 4


module.exports를 이용하여 모듈화 하는 방법
다음과 같이 module.expots 에 할당하고 require를 통해 불러올 수도 있습니다.
같은 변수와 같은 함수명을 사용했는데 require로 불러 올 때 변수명을 통해 불러오는 것 처럼 보이지만 calc 객체의 참조값을 가져온다는 점에 주의합니다.
때문에 모듈1의 calc 객체와 모듈2의 calc 객체는 서로 다른객체 즉 서로 다른 참조값을 가지므로 main.js의 calc.add와 calc2.add는 서로 다른 객체의 add 메서드임을 확인할 수 있습니다.


calcModule.js
var calc = {};
calc.add = function(arg1 , arg2){
    console.log('cal1');
    return arg1 + arg2;
};
module.exports = calc;

calcModule2.js
var calc = {};
calc.add = function(arg1 , arg2){
    console.log('cal2');
    return arg1 + arg2;
};
module.exports = calc;

main.js 
var calc = require('./calcModule');
var calc2 = require('./calcModule2');
console.log('main.js에서 calc.add() 호출 ' + calc.add(1, 3));
console.log('main.js에서 calc2.add() 호출 ' + calc2.add(1, 3));


결과 
cal1
main.js에서 calc.add() 호출 4
cal2
main.js에서 calc2.add() 호출 4




ref : http://dololak.tistory.com/97


+ Recent posts