1. 모듈(Module)
- 특정 기능을 담당하는 하나의 파일.
2. 라이브러리(Library)
- 비슷한 기능을 수행하는 모듈들의 집합.
3. 패키지(Package)
- 하나 이상의 모듈 / 라이브러리를 포함하는 소프트웨어 단위.
JavaScript
에서는package.json
파일로 관리.- 프로그래밍 언어마다 패키지를 지칭하는 명칭이나 관리 방식이 다름.
4. 프레임워크(Framework)
- 애플리케이션 개발을 위한 전체적인 구조를 제공하는 소프트웨어.
- 여러 패키지와 라이브러리 포함.
import
와 export
키워드 사용.웹 브라우저
와 Node.js
모두에서 사용 가능.1. pakage.json 생성 후 작성
{
"type": "module" // 모듈 시스템을 ES 모듈로 사용하겠다고 명시하는 설정.
}
2. ES 모듈
// math.js
function add(a, b) {
return a + b;
}
export { add };
3. ES 모듈 사용
// main.js
import { add } from "./math.js";
console.log(add(1, 2)); // 3
모듈을 사용하는 방식에는 CommonJs
방식과 ES 모듈
방식이 있으나 현재 개발 트렌드에서는 ES 모듈 방식을 선호한다.
export
: 모듈에서 값 또는 함수를 내보낼 때 사용.import
: 다른 모듈에서 값 또는 함수를 가져올 때 사용.export
키워드와 함께 중괄호 {}
사용.
[ 모듈 내보내기 코드 ]
// math.js // 더하기 function add(n1, n2) { return n1 + n2; } // 빼기 function subtract(n1, n2) { return n1 - n2; } // 곱하기 function multiply(n1, n2) { return n1 * n2; } // 나누기 function divide(n1, n2) { return n1 / n2; } // 상수 const PI = 3.14; // 함수 내보내기 // export { 함수명1, 함수명2, ... } export { add, subtract, multiply, divide };
[ 모듈 불러오기 코드 ]
// main.js // // 함수 불러오기 // import {함수명1, 함수명2, ... } from ... import { add, subtract, multiply, divide } from "./math.js"; console.log(add(1, 2)); //3 console.log(subtract(1, 2)); // -1 console.log(multiply(1, 2)); // 2 console.log(divide(1, 2)); // 0.5
[ 일부 모듈만 불러오기 ]
// main.js import { PI, add, multiply } from "./math.js"; const a = 1; const b = 2; console.log("원주율:", PI); console.log(add(a, b)); console.log(multiply(a, b));
[ 불러온 함수에 별칭 부여 ]
as
키워드 사용// main.js import { add as 더하기, subtract as 빼기, PI as 원주율 } from "./math.js"; console.log("2 + 3 =", 더하기(2, 3)); // 2 + 3 = 5 console.log("5 - 2 =", 빼기(5, 2)); // 5 - 2 = 3 console.log("원주율:", 원주율); // 원주율: 3.14159
[ 모든 내보내기 불러오기 키워드 사용 ]
// main.js import * as math from "./math.js"; const a = 1; const b = 2; console.log(math); console.log("원주율:", math.PI); console.log("자연상수:", math.E); console.log(`a + b = ${math.add(a, b)}`); // a + b = 3 console.log(`a - b = ${math.subtract(a, b)}`); // a - b = -1 console.log(`a * b = ${math.multiply(a, b)}`); // a * b = 2 console.log(`a / b = ${math.divide(a, b)}`); // a / b = 0.5
export
키워드와 default
키워드를 함께 사용, 중괄호 {}
없이 사용.
[ 모듈 내보내기 코드 ]
// calculator.js // 계산기 객체 생성 및 속성 할당 const calObj = { add: function (n1, n2) { return n1 + n2; }, subtract: function (n1, n2) { return n1 - n2; }, // multiply 함수 multiply: function (n1, n2) { return n1 * n2; }, // divide는 화살표 함수로 표현해보기 divide: (n1, n2) => { return n1 / n2; }, }; // 하나만 내보내기(Default Export) export default calObj;
[ 모듈 불러오기 코드 ]
// calObj 가 아닌 calculator 로 import 할 수 있다. // 단 하나만을 export 했기 때문이다. import calculator from "./calculator.js"; console.log(calculator); /* { add: [Function: add], subtract: [Function: subtract], multiply: [Function: multiply], divide: [Function: divide] } */ console.log(calculator.add(1, 2)); // 3
JavaScript 패키지 관리 도구
Node.js
와 함께 자동 설치
package.json
파일로 패키지 의존성 관리
의존성: 특정 패키지를 사용하기 위해 필요한 다른 패키지
{ "type": "module", "name": "11-module", "version": "1.0.0", "description": "", "main": "main.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC", "dependencies": { "dayjs": "^1.11.18" } }
[ 주요 속성 ]
name
: 프로젝트 이름version
: 프로젝트 버전main
: 프로젝트 진입점 파일type
: 모듈 시스템 타입 ("module"
또는"commonjs"
)scripts
:npm run
명령어로 실행 가능한 커스텀 명령어들dependencies
: 실행에 필요한 패키지devDependencies
: 개발에만 필요한 패키지
예를 들어 dayjs
라는 패키지를 설치한다고 가정해 보자.
npm install dayjs // 설치 명령어
이 명령어를 실행하면, 프로젝트 루트 디렉토리에 node_modules
라는 e디렉토리가 생긴다.
그 안에는 단순히 dayjs
파일만 있는 게 아니라, dayjs
파일이 내부적으로 의존하는 다른 패키지들까지 함께 설치되기 때문에 수백 ~ 수천 개의 파일이 쌓이게 된다.
node_modules
는 너무 많은 파일을 포함하기 때문에 Git 저장소에 올리면:
저장소 용량이 불필요하게 커지고,
clone / checkout
속도가 느려지고,
충돌 관리가 매우 힘들어진다.
실제 협업 환경에서 이런 문제는 프로젝트 진행에 심각한 부하를 줄 수 있다.
따라서 반드시 .gitignore
파일에 node_modules
디렉토리를 추가해야 한다.
참고로, node_modules
를 제외해도 괜찮은 이유는 package.json
파일과 package-lock.json
파일에 있다.
{ "dependencies": { "dayjs": "^1.11.13" } }
npm install
을 실행했을 때, 실제로 설치된 정확한 버전과 의존성 트리 구조를 기록하는 파일.
각 패키지가 정확히 어떤 버전으로 설치되었는지 잠금(lock) 역할을 한다.
협업자들이 npm install
만 명령어 실행하면, 이 파일을 기준으로 똑같은 node_modules
구조가 재현 된다.
- 개발자가
npm install dayjs
실행 →package.json
에"dayjs": "^1.11.13"
추가.
- 동시에
package-lock.json
도 업데이트 → 정확히1.11.13
이 설치된 사실을 기록.
- 팀원이 저장소를 clone :
npm install
실행 시,
우선
package-lock.json
을 참고해 정확한 버전을 설치.만약,
package-lock.json
이 없다면,package.json
의 버전 범위를 보고 새 버전을 설치.
- 그래서 두 파일은 서로 보완 관계
package.json → "어떤 라이브러리가 필요한가?" (사람 / 머신 모두 보는 설계도)
package-lock.json → "정확히 어떤 버전으로 설치해야 하나?" (환경 동결 보증서)