앞선 아티클까지 module.exports 객체를 이용해 특정 Javascript 파일을 '모듈'화 시키는 방법을 살펴보았습니다. 이번에는 모듈화를 시키는 주요 요소인 module.exports에 대해서 살펴보겠습니다. 이전 예제에서 module.exports를 사용한 [var.js]를 다시 살펴보겠습니다.
/* var.js */
const odd = 'CJS 홀수';
const even = 'CJS 짝수';
module.exports = {
odd,
even,
};
odd와 even 변수를 module.exports 객체에 대입하여 모듈로 만들었습니다. 그런데 여기서 module.exports가 있는 라인을 아래처럼 바꾸고 [index.js]를 실행시켜 보도록 하겠습니다.
/* var.js */
exports.odd = 'CJS 홀수';
exports.even = 'CJS 짝수';
/*
const odd = 'CJS 홀수';
const even = 'CJS 짝수';
module.exports = {
odd,
even,
};
*/
/* 출력
CJS 짝수
CJS 홀수
*/
module.exports 객체에 모든 변수를 한 번에 대입하지 않고 exports 객체에 각 변수를 대입했습니다. 역시 결과는 동일하게 동작하는 것을 확인할 수 있는데, 결론부터 얘기하자면 exports와 module.exports는 동일한 객체를 참조하고 있기 때문에 실제 결과는 동일하게 나오는 것입니다.
아래와 같이 검증도 가능합니다.
console.log(module.exports === exports);
/* 출력
true
*/
exports는 module.exports를 참조하고, 이 module.exports가 한 객체를 참조하는 구조이기에 가능한 것입니다. 그렇기 때문에 add라는 함수를 exports에 대입할 경우, 이 add는 module.exports에도 대입됩니다.
주의할 점도 살펴보겠습니다. 기본적으로 module.exports는 앞선 예제들에서도 알 수 있듯이 어떤 값이든 대입이 가능합니다. 함수, 변수 등을 자유롭게 대입했죠. 하지만 exports는 반드시 위의 예제처럼 속성명과 속성값을 대입하는 형식으로 사용해야 합니다. 만일 exports에 임의의 다른 값을 대입하거나 한다면, 이 module.exports와의 참조 관계가 끊겨서 모듈로서의 기능을 잃어버리기 때문입니다.
그래서 exports를 사용해 모듈을 만들 때는 함수를 대입할 수 없습니다. [func.js]에서는 checkOddOrEven라는 함수를 module.exports에 대입했는데, 이 경우에는 exports를 사용할 수 없는 것이죠. 더불어 한 파일에서 exports, module.exports를 동시에 사용하는 일도 없어야 하겠습니다. 같은 참조관계이니까요.
'Programming > Node.js' 카테고리의 다른 글
4. Node 기능 살펴보기 (2) - 모듈 사용하기 : CommonJS 5 [require 1] (0) | 2024.03.20 |
---|---|
4. Node 기능 살펴보기 (2) - 모듈 사용하기 : CommonJS 4 (0) | 2024.03.19 |
4. Node 기능 살펴보기 (2) - 모듈 사용하기 : CommonJS 2 (0) | 2024.03.15 |
4. Node 기능 살펴보기 (2) - 모듈 사용하기 : CommonJS 1 (2) | 2024.03.13 |
4. Node 기능 살펴보기 (1) - REPL 사용 (0) | 2024.03.13 |