그디어 프로젝트에 들어갔는데, 수많은 에러에 부딪히고 있습니다. 깃 허브 merge가 안되고 pull 이 이상하게 되는 것 부터 시작해서, jsonwebtoken에 미들웨어를 어떻게 넣어서 할지...그리고 router를 정리하다보니 module.exports가 어떻게 동작하는지 이해가 필요했습니다.
모듈이란 외부에 영향을 받지않는 독립된, 재사용 가능한 코드들의 묶음입니다. 또 다른 설명으로는 관련된 코드들의 하나의 코드 단위로 캡슐화하는 걸 말합니다.
모듈은 2가지로 나눌 수가 있습니다.
모듈을 생성하려면 소스파일을 만들고 모듈화할 변수나 함수를 export 객체의 프로퍼티로 '할당'하면 됩니다.
module.exports 역시 모듈화할 수 있습니다. exports와 다른 점은 exports는 객체에 프로퍼티를 추가했지만, module.exports는 변수에 아예 새로운 객체를 할당했습니다.
exports 객체와 module.exports객체는 동일하며 exports가 module.exports객체를 call by reference 방식으로 바라보고 있으며, 최종적으로 리턴값은 module.exports입니다
node.js의 모듈 시스템에서 실제로 exports되는 객체는 module.exports
이고 exports는 이를 참조하는 변수에 불과합니다.
그래서 만약 exports에 새로운 객체를 할당한다면, module.exports와 상관 없는 변수가 되기때문에 모듈이 동작하지않습니다. 다른 객체를 할당해버린다면, module.exports는 빈 객체 입니다.
위와같은 차이를 어떻게 활용하냐면
exports는 여러개의 객체를 내보낼려고 할떄 exports의 변수 속성으로 할당할 수 있고
단일 객체를 내보낼려고 할때는 module.exports 변수 자체에 할당 할 수 있습니다.
require란 CommonJS에서 모듈을 불러올때 사용되는 키워드입니다.
project/
├── app.js
└── module/
├── index.js
├── calc.js
└── print.js
require에서 이해가 되지않았던 부분은 const call = require('./module');
을 호출한다고 했을 때, 자동적으로 디렉터리의 index.js를 로드한다는 것입니다. (이걸 몰라서, 다른 문제 오류가 발생하는게 이것때문인가 싶어서 일일히 /module/index.js
를 지정하고 했습니다. 그러지맙시다...)
require은 항상 module.exports
를 리턴 받습니다.
위에서 사용한 CommonJS방식으로는 전체 모듈을 다 불러오게되고, 불필요한 모듈이 로드되기도 하고 모듈내에서 어떤 부분을 사용했는지 확인할 수 없었습니다.
때문에 ES6부터 import/export라는 방식으로 모듈을 불러오고 내보낼수 있습니다.
import {moduleEx, moduleEx2} from 'module';
require()는 어느지점에서나 호출할 수 있지만, import()는 파일의 시작 부분에서만 실행할 수 있씁니다.
https://victorydntmd.tistory.com/16
http://happinessoncode.com/2018/05/20/nodejs-exports-and-module-exports/