-
NodeJS Module(export, require)개발언어/Node.js 2022. 7. 8. 16:40
Module
규모있는 프로젝트를 만들때는 이 module이 항상사용된다.
module은 ConsoleModule, NetworkModule, HTTPModule와 같이 연관 된 것들이 묶여 있는 것 처럼 project를 만들때도 연관이 있는 것들은 한 file내에 module별로 관리하는 것이 좋다.
위와 같은 code가 있는 counter.js file을 동일 폴더에 있는 app.js에서 이용하기 위해서는 counter.js에서 export를 하고 app.js에서 받아와야 한다.
즉 app.js에서 그냥 count 변수에 접근하거나, 함수 getCount를 이용하게 되면, count가 정의 되어있지 않다고 error message를 출력한다.
export/import(NodeJs ver.)
다른 module에 있는 것을 쓰기 위해서는 해당하는 module에서 어떤 것을 외부에 노출할 건지 즉 export할 것인지를 정해야하고 사용하는 module에서 어떤 것을 import 즉 가지고 올 것인지를 명시해주어야 한다.
예전 JS version에는 import/ export에 관한 것이 없었기 때문에 NodeJS 자체적으로 module을 import/export하는 것이 만들어 졌다. 그래서 browser에서 사용하는 import/export와 문법이다르다.
export
export를 하고자 한다면 위 코드와 같이 module.exports에 export하고자 하는 것을 등록하면 된다. 그러면 counter라는 module안에는 2가지의 사용자정의 함수가 연결되어 있는 것을 확인 할 수 있다.
그리고 count라는 변수는 외부에 노출하지 않았다. counter module내부적으로만 count 변수의 값을 변경하고,
외부서는 counter module에서 제공한 getCount함수와 increase함수 만 이용해서 변수 count의 값을 변경할 수 있다.
importer
위와 같은 코드로 counter module을 import 해 올 수 있다. 이렇게 작성된 여러 module에서 내가 노출하고 싶은 것만 노출을 해주고 사용하는 곳에서 require라는 문법을 이용해서 가지고 올 수 있다.
console.log(module);
module에 대한 명세를 출력해서 볼 수 있다.
export시 module 생략
export를 할 때 위 코드 처럼 module을 생략할 수 있지만 module.exports. 과 exports. 엄밀히 얘기하면 다르다. export라는 것은 처음에는 module.export라는 것을 가르키고 있으므로 module.export.increase = increase라고 하지 않고 export.increase = increase라고 만 해도 module을 생략하고도 exports에 increase를 할당 할 수 있다.
그런데 조금 헷갈릴 수 있는 부분이 exports라는 것은 module.export 참조하는 참조 값을 가지고 있다 그래서 그 참조 값을 이용해서 increase같은 함수를 등록할 수 있지만, 한번 export에 텅빈 object를 할당을 해버리면, 그 다음에 오는 export.increase = increases는 module.exports가 아니라 빈 object에 할당이 되기 때문이다.
exports = {} 를 할당하므로써 module.exports와 exports는 전혀 다른 값이 된다. 그래서 exports를 사용할 때는 특정한 값을 바로 할당하면 위험할 수도 있다.
정리
위 와 같은 방식은 오래전 JS자체에 export/import 기능이 없을 때 NodeJS에서 자체적으로 만든 오래된 방식이고, 2015년부터는 ES6 자체에서 module을 export/import하는 기능을 지원하고 있다.
'개발언어 > Node.js' 카테고리의 다른 글
NodeJS 운영체제 정보 (0) 2022.07.08 NodeJS 최신 Module(export/import) (0) 2022.07.08 NodeJS this(브라우저와의 차이점) (0) 2022.07.08 NodeJS console.log() (0) 2022.07.08 NodeJS - Global Object (0) 2022.07.08