[Node.JS] module.export 와 exports의 차이

잡초·2023년 5월 5일
0
post-thumbnail

모듈이란

모듈은 특정한 기능을 하는 함수나 변수들의 집합이다.
코드의 길이를 줄이고, 유지보수를 용이하게 할 수 있다는 장점이 있다.
이러한 모듈을 export하는 두 가지 방법인 module.exports와 exports의 차이점을 알아보자.

module.export

module.js

const test = {
    name: "Kim",
    text: "Hi"
}

module.exports = test;

main.js

const user = require('./module');

console.log(user);

output

$ node main
{ name: "Kim", text: 'Hi' }

main.js에서 정상적으로 module.js에서 작성한 john이라는 객체를 가져올 수 있다.

exports

exports도 위의 module.exports와 같이 작성해보자.

exports.js

const test = {
    name: "Kim",
    text: "Hi"
}

exports = test;

main.js

const user = require('./exports');

console.log(user);

output

$ node main
{}

의도와 다르게 원하는 객체가 제대로 가져와지지 않았다.

다음과 같이 property에 접근하는 형태로 코드를 수정해보자.

exports.js

const test = {
    name: "Kim",
    text: "Hi"
}

exports.person = test;

main.js

const user = require('./exports');

console.log(user.person);

output

$ node main
{ name: "Kim", text: 'Hi' }

원하는 객체가 정상적으로 가져와졌다.

module.export 와 exports의 차이

단순한 코드로 exports와 module.exports의 차이를 설명하자면 다음과 같다.

const module = { exports: {} };
const exports = module.exports;
// your code 
return module.exports;

exports객체와 module.exports객체는 동일하며, exports 가 module.exports객체를 call by reference(함수에서 값을 전달하는 대신 주소값을 전달하는) 방식으로 바라보고 있으며, 최종적으로 리턴값은 module.exports 라는것이다.

위의 예제중에서 exports는 property 방식을 쓰고 module.exports는 그냥 바로 썻는데
그 이유는 exports를 바로 써버리면 module.exports의 call by reference 관계를 끊어버려서 exports라는 변수가 되버리기 때문이다.

결론

  • exports는 module.exports를 참조하고 있다.
  • exports는 프로퍼티에 접근하는 방식으로 사용한다.
  • module.exports는 바로 사용한다.
  • 헷갈린다면 module.exports를 사용하자.
const test = {
    name: "Kim",
    text: "Hi"
}

module.exports.person = test; // (o)
module.exports = test; // (o) 

exports.person = test; // (o)
exports = test; // (x)
profile
개발자가 되고싶은 잡초

0개의 댓글