module.exports와 exports 차이 이해하기
모듈이란?
모듈
이란 관련된 코드들을 하나의 코드 단위로 캡슐화 하는 것을 말합니다. Node.js 에서 예시를 살펴보겠습니다.
다음과 같은 greeting.js
라는 파일이 있습니다. 이 파일은 두개의 함수를 포함하고 있습니다.
1 | // greetings.js |
모듈 추출하기(exporting)
gretting.js
의 코드가 다른 파일에서 사용될 때 그 효용성이 증가할 것입니다. 이러한 일을 하기 위해서는 다음과 같은 3가지의 단계
를 거쳐야 합니다.
1.greeting.js
파일의 코드 첫 부분에 다음과 같은 코드가 존재해야 합니다.
1 | // greetings.js |
2.다른 파일에서 exports 객체를 사용하기를 원한다면 greeting.js 파일에서 다음과 같이 작성해야 합니다.
1 | // greetings.js |
위의 코드에서 exports 를 module.exports 로 대체할 수 있으며 같은 결과를 얻을 수 있습니다. 이 부분이 잘 이해가 가지 않는다면 exports 와 module.exports 가 같은 객체를 참조한다고 기억하기 바랍니다.
3.module.exports 의 현재 값은 다음과 같습니다.
1 | module.exports = { |
모듈 사용하기(importing)
main.js
라는 새로운 파일에서 greeting.js
의 메소드를 사용 할 수 있도록 import 하는 과정은 다음과 같습니다.
1.먼저 require
이라는 키워드는 Node.js 에서 module(모듈)을 import(추가) 하기 위해 사용합니다. require는 다음과 같이 정의되어 있습니다.
1 | var require = function(path) { |
2.main.js
에서 greetings.js
를 require 합니다.
1 | // main.js |
위의 코드는 아래와 동일한 코드 입니다.
1 | // main.js |
3.main.js
에서 greeting.js
의 값과 메소드에 접근할 수 있습니다.
1 | // main.js |
중요 포인트
require 키워드는 object
를 반환합니다. 그리고 module.exports 와 exports 는 call by reference
로 동일한 객체를 바라보고 있고, 리턴되는 값은 항상 module.exports 입니다.
모듈은 기본적으로 객체이고, 이 객체를 module.exports, exports 모두 바라보고 있는데, 최종적으로 return 되는 것은 무조건 module.exports 라는 것입니다.
1 | var express = require('express'); |
위의 소스는 다음과 같이 해석할 수 있습니다.
express.Router() 가 리턴한 “객체”에 일부 프로퍼티를 수정한 뒤, 이 객체 자체를 모듈로 리턴한 것입니다.