Node.js module system
module == 레고 조각
여러 모듈을 조합하여 하나의 소프트웨어 만듦
코드를 잘 모듈화 함
Built-in module : 기본적으로 내장되어 있는 모듈
Custom module : Node.js CommonJS 방식으로 만든 모듈
3rd-party module : 다른 개발자들이 만들어 둔 모듈
JavaScript를 브라우저에서만 사용하는 언어가 아닌
일반적인 범용 언어로 사용하고자 함
=> 명세(specifiacation) 만듦
Node.js module system도 Common JS의 Module Specification 따름
모든 모듈은 자신만의 독립적인 실행 영역이 필요
전역변수(Global variable)와 지역변수(Local variable)를 분리함을 의미
파일 하나에 모듈 하나를 작성하는 방법으로 독립적인 실행 영역 확보
모듈을 외부에서 사용할 수 있도록 공개
exports라는 전역 객체 이용해서 정의
require() 함수를 이용해서 모듈 불러오기
모듈은 module.exports 또는 exports 객체를 통해 정의하여 외부로 공개,
공개된 모듈은 require 함수를 사용하여 import!
여러 개의 속성과 메소드 정의 가능
// calculator.js
const initialNum = 0
exports.add = (x, y) => initialNum + x + y;
// export 객체에 add method 정의
exports.substract = (x, y) => initialNum + x - y;
// export 객체에 substract method 정의
calculator.js는 독립적인 파일 스코프를 갖는 모듈
<exports 객체의 메소드로 정의>
add
substract
이때 변수 initialNum은 calculator 모듈에서 유효한 private 변수 지정
외부에 공개했을 때 사용 가능
// main.js
const calculator = require("./calculator.js");
console.log(`1 + 5 = ${calculator.add(1, 5)}`);
console.log(`1 - 5 = ${calculator.subtract(1, 5)}`);
main.js에서 require()로 calculator 호출하여 사용 가능
claculator 모듈은 객체 형태로 반환되어 calculator 변수에 담김
하나의 객체만 할당 가능
// calculator.js
const initialNumber = 0
function add(a, b) {
return a + b;
}
function substract(a, b) {
return a - b;
}
module.exports = {
add,
substract
}
calculator 모듈의 module.exports에는 하나의 객체만 할당
// main.js
const calculator = require("./calculator.js");
console.log(`1 + 5 = ${calculator.add(1, 5)}`);
console.log(`1 - 5 = ${calculator.substract(1, 5)}`);
require()함수를 통해 calculator moduel import -> calculator 변수에 할당
// main.js
const {add, substract} = require("./calculator.js");
console.log(`1 + 5 = ${add(1, 5)}`);
console.log(`1 - 5 = ${substract(1, 5)}`);
구조분해 할당하여 사용 가능!
Node.js는 할 수 있지만
JavaScript는 못하는 일
= 파일 시스템(File System)에서 파일을 읽고 쓰는 기능
//syncFileSystem.js
const fileSystem = require('fs')
require()함수를 사용해서 FS 모듈 호출,
모듈 안에 우리가 사용할 수 있는 많은 함수들이 있는 객체 반환
// CASE 2. Non-blocking, Asynchronous
// asyncFileSystem.js
const fileSystem = require("fs");
// Read File (Before)
fileSystem.readFile("./privateInformation.txt", "utf-8", (err, data1) => {
console.log(`===== Before written ===== \n${data1}`);
const additionalInfo = `${data1}PhoneNumber : 010-7777-0000\nModified at : ${Date.now()}`;
// Write File
fileSystem.writeFile("./privateInformation.txt", additionalInfo, "utf-8", (err, data2) => {
console.log("===== Your file has been written =====");
// Read File (After)
fileSystem.readFile("./privateInformation.txt", "utf-8", (err, data3) => {
console.log(`===== After written ===== \n${data3}`);
});
}
);
});
실행결과
//zsh
$ node asyncFileSystem.js
===== 추가적으로 실행되어야 하는 코드 =====
추가적으로 실행되어야 하는 코드 1
추가적으로 실행되어야 하는 코드 2
추가적으로 실행되어야 하는 코드 3
추가적으로 실행되어야 하는 코드 4
===== Before written =====
Name : Harry Potter
Age : 22
===== Your file has been written =====
===== After written =====
Name : Harry Potter
Age : 22
PhoneNumber : 010-7777-0000
Modified at : 1653192110477
비동기 함수가 실행되면 작업이 끝날 때까지 기다려주지 않고
바로 출력할 수 있는 결과부터 내보낸다
시간이 걸리는 작업들은 백그라운드에게 작업을 위임하여 실행 후 출력
이를 NPM 이라 통칭
텍스트
package.json
프로젝트에 대한 정보와 사용 중인 npm 패키지에 대한 정보를 담은 파일
버전 명시 필요
npm init - y
pacakage.json 파일의 속성
# pacakage.json 파일
{
"name": "api",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "lordmyshepherd",
"license": "MIT",
"dependencies": {
"bcryptjs": "^2.4.3",
"cors": "^2.8.5",
"dotenv": "^16.0.0",
"express": "^4.17.3",
"jsonwebtoken": "^8.5.1",
"mysql2": "^2.3.3",
"typeorm": "^0.3.0"
},
"devDependencies": {
"nodemon": "^2.0.15"
}
}