처음 코딩을 배울 때는 하나의 파일에 모든 코드를 작성하게 됩니다.
하지만 프로젝트가 커질수록 한 파일에 코드를 길게 적으면 이런 문제들이 생깁니다.
| 문제 | 설명 |
|---|---|
| 가독성 저하 | 어디에 어떤 코드가 있는지 찾기 어렵다 |
| 디버깅 어려움 | 오류가 났을 때 원인을 찾기 어렵다 |
| 사이드 이펙트 | 기능을 수정하다가 다른 기능까지 망가질 수 있다 |
| 협업 불편 | 여러 사람이 함께 작업하기 어렵다 |
| 재사용 불가 | 코드를 다른 곳에서 재사용하기 어렵다 |
이 문제를 해결하는 것이 바로 모듈 시스템입니다.
module.exports — "이 기능을 다른 파일에서도 쓸 수 있게 내보낼게"// math.js
function add(a, b) {
return a + b;
}
function subtract(a, b) {
return a - b;
}
function multiply(a, b) {
return a * b;
}
function div(a, b) {
return a / b;
}
function power(a, b) {
return a ** b;
}
function sqare(a) {
return a * a;
}
module.exports = {
add,
subtract,
multiply,
div,
power,
sqare,
};
{ add: add }처럼 키와 값이 같을 때는{ add }로 줄여 쓸 수 있습니다!
자바스크립트에서 앞뒤가 똑같으면 하나만 써도 됩니다.
require() — "저 파일에 있는 기능을 가져와서 사용할게"// app.js
const { add, subtract, multiply, div, power, sqare } = require("./math");
require("./math")로 math.js에서 내보낸 객체 전체를 가져온 다음,
구조 분해 할당으로 필요한 함수만 꺼내서 사용합니다.
process.argv — 터미널에서 입력값 받기Node.js에서 터미널로 직접 인수를 전달하려면 process.argv를 사용합니다.
node app.js add 10 5
process.argv는 배열이고, 각 인덱스의 의미는 다음과 같습니다.
| 인덱스 | 내용 | 설명 |
|---|---|---|
[0] | Node 실행 경로 | 컴퓨터 내의 node 실행 파일이 위치한 절대 경로 |
[1] | 스크립트 파일 경로 | 현재 실행 중인 자바스크립트 파일의 절대 경로 |
[2] | 첫 번째 추가 인수 | 사용자가 직접 입력한 첫 번째 데이터 (파라미터) |
[3] | 두 번째 추가 인수 | 사용자가 입력한 두 번째 데이터 |
math.js의 함수들을 app.js에서 불러와, 터미널 입력값으로 연산을 수행하는 계산기를 만들어봤습니다.
// app.js
const { add, subtract, multiply, div, power, sqare } = require("./math");
const operator = process.argv[2]; // 연산자
const num1 = Number(process.argv[3]); // 첫 번째 숫자
const num2 = Number(process.argv[4]); // 두 번째 숫자
if (operator === "add") {
console.log(add(num1, num2));
} else if (operator === "subtract") {
console.log(subtract(num1, num2));
} else if (operator === "multiply") {
console.log(multiply(num1, num2));
} else if (operator === "div") {
console.log(div(num1, num2));
} else if (operator === "power") {
console.log(power(num1, num2));
} else if (operator === "sqare") {
console.log(sqare(num1));
} else {
console.log("지원하지 않는 연산자입니다");
}
node app.js add 10 5 # 15
node app.js subtract 10 5 # 5
node app.js multiply 10 5 # 50
node app.js div 10 5 # 2
node app.js power 2 8 # 256
node app.js sqare 9 # 81
process.argv로 받아오는 값은 문자열(string) 이기 때문에,
숫자 연산을 하려면 반드시Number()로 변환해줘야 합니다!
math.js ──[module.exports]──▶ app.js
◀──[require()]──────
module.exports : 기능을 파일 밖으로 내보낸다require() : 다른 파일의 기능을 내 파일로 가져온다process.argv : 터미널 실행 시 입력한 값을 배열로 받아온다모듈로 파일을 분리하면 코드가 훨씬 읽기 쉽고, 수정하기 쉽고, 재사용하기 쉬워집니다.