모듈이란
여러 독립된 기능들에 관한 코드가 모여있는 하나의 파일
모듈의 특징
- 유지보수성
기능들이 모듈화가 잘 되어있다면, 의존성을 그만큼 줄일 수 있기 때문에 어떤 기능을 개선하거나 수정할 때 편하다.
- 네임스페이스화
js의 전역 변수는 전역 공간을 차지하는데 모듈을 분리하면 모듈만의 네임스페이스를 갖기 때문에 중복을 방지한다.
- 재사용성
똑같은 코드를 반복하지 않고, 모듈로 분리시켜서 필요할 때마다 사용 할 수 있다.
모듈 유형
- 외장 모듈
일반 node.js 개발자들이 만들어 놓은 모듈(라이브러리)
외장 모듈을 사용 하기 위해선 npm을 사용
- 내장 모듈
node.js를 설치하면 제공되는 기본 모듈
module객체 확인
console.log(module)
/*
Module {
id: '.',
path: '/Users/ksnotebook/Desktop/test/node/module_practice',
exports: {}, //💥 이 프로퍼티 주목! 💥
parent: null,
filename: '/Users/ksnotebook/Desktop/test/node/module_practice/calc.js',
loaded: false,
children: [],
paths: [
'/Users/ksnotebook/Desktop/test/node/module_practice/node_modules',
'/Users/ksnotebook/Desktop/test/node/node_modules',
'/Users/ksnotebook/Desktop/test/node_modules',
'/Users/ksnotebook/Desktop/node_modules',
'/Users/ksnotebook/node_modules',
'/Users/node_modules',
'/node_modules'
]
}
*/
module.exports는 빈 객체
require()
외부 모듈울 가져와서 사용 가능하게 해주는 메소드
require('파일 경로')로 외부 모듈을 가져온다.
// some.js
console.log('hello')
// app.js
require('./some.js')
// node app.js 실행시
// 'hello'
app.js를 실행시켰지만, some.js의 콘솔로그가 실행된다. (some.js 에서 모듈을 require()로 가져왔기 때문)
// some.js
const greet = function() {
console.log('greeting to see you')
}
// app.js
require('./some.js')
greet()
// node app.js 실행시
// 에러발생
app.js 에서 greet() 함수를 실행시켰을 때 some.js 에서 정의된 greet 함수를 호출할 수 없다.(모듈의 기능으로 모듈 안의 API를 보호하기 때문)
require()로 가져와도 해당 모듈의 함수에 접근 권한은 없다. 모듈을 밖으로 내보낼 때 module.exports의 object를 정의해야 권한이 생김
해결방법
// some.js
const greet = function() {
console.log('greeting to see you')
}
// module.exports에 외부에 공유할 API 대입하기
module.exports = greet
// app.js
const greeting = require('./some.js')
greeting()
// node app.js 실행시
// 'greeting to see you'
module.exports의 프로퍼티는 빈 객체이므로, greet 메소드를 대입하여 외부에서도 사용할 수 있도록 해준다.
app.js에서는 새 변수 greeting을 만들어 module.exports의 greet메소드를 받아 사용한다.
require 실행구조
// require()함수의 실행 구조
var require = (function(src){ //line 1 -> src를 받음
var fileAsStr = readFile(src) //line 2 -> src파일을 읽어 fileAsStr에 할당
var module.exports = {} //line 3 -> module.export에 빈 객체 할당
eval(fileAsStr) //line 4 -> fileAsStr을 eval함
return module.exports //line 5 -> 리턴함
})()
즉, 경로에 들어온 파일을 읽고, 해당 파일의 module.exprots를 가져와서 리턴하기 때문에 해당 모듈의 기능을 사용할 수 있다.
IIFE(Immediately Invoked Function Expressions)
정의와 동시에 즉시 실행되는 함수
(function add(a, b) {
console.log(a + b)
})(1, 4)
// 5
require과 IIFE의 관련성
require로 모듈을 불러오면 그 즉시 실행된다는 특징을 가진다.
// test.js
console.log("I'm from test.js");
// app.js
require('./test.js');
// node app.js
// "I'm from test.js"
require로 모듈을 가져와서 바로 실행하다 보니 콘솔로그가 바로 찍힌다.
'coding > Node.js' 카테고리의 다른 글
계층형 아키텍처 패턴(Layered Architecture Pattern) (0) | 2022.08.05 |
---|---|
nodemon (0) | 2022.08.04 |
sequelize CRUD 사용법 (0) | 2022.08.02 |
package.json (0) | 2022.07.31 |
npm jsonwebtoken (0) | 2022.07.29 |