npm 알아보기 & package.json으로 패키지 관리하기
npm 알아보기
npm은 Node Package Manager의 약어로, 이를 그대로 노드 패키지 매니저입니다. 대부분의 자바스크립트 프로그램은 패키지라는 이름으로 npm에 등록되어 있으므로 특정 기능을 하는 패키지가 필요하다면 npm에 찾아 설치하면 됩니다.
방대한 양의 패키지는 노드와 자바스크립트의 생태계를 더욱 견고하게 만들고 있습니다. 게다가 대부분 오픈 소스여서 노드를 사용해 웹을 개발할 때 많은 도움이 됩니다.
npm에 업로드된 노드 모듈을 패키지라고 부릅니다. 모듈이 다른 모듈을 사용할 수 있는 것처럼, 패키지가 다른 패키지를 사용할 수도 있습니다.
package.json으로 패키지 관리하기
설치한 패키지의 버전을 관리하는 파일이 바로 package.json입니다.
따라서 노드 프로젝트를 시작하기 전에는 폴더 내부에 무조건 package.json부터 만들고 시작해야 합니다. npm은 package.json을 만드는 명령어를 제공합니다.
먼저 콘솔로 프로젝트를 시작할 폴더로 이동한 후, 다음 명령어를 입력합니다.
$ npm init
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.
See `npm help init` for definitive documentation on these fields
and exactly what they do.
Use `npm install <pkg>` afterwards to install a package and
save it as a dependency in the package.json file.
Press ^C at any time to quit.
package name: (폴더명) [프로젝트 이름 입력]
version: (1.0.0) [프로젝트 버전 입력]
description: [프로젝트 설명 입력]
entry point: (index.js)
test command: [엔터 키 클릭]
git repository: [엔터 키 클릭]
keywords: [엔터 키 클릭]
author: [이름 입력]
license: (ISC) [엔터 키 클릭]
type: (commonjs)
About to write to D:\공부\Nodejs\5-2\package.json:
{
"name": "npmtest",
"version": "0.0.1",
"description": "hello package.json",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "cherry",
"license": "ISC",
"type": "commonjs"
}
Is this OK? (yes) yes
- package name: 패키지의 이름입니다. package.json의 name 속성에 저장됩니다.
- version: 패키지의 버전입니다. npm의 버전은 다소 엄격하게 관리됩니다.
- entry point: 자바스크립트 실행 파일 진입점입니다. 보통 마지막으로 module.exports를 하는 파일을 지정합니다. package.json의 main 속성에 저장됩니다.
- test command: 코드를 테스트할 때 입력할 명령어를 의미합니다. package.json scripts 속성 안의 test 속성에 저장됩니다.
- git repository: 코드를 저장해둔 것(Git) 저장소 주소를 의미합니다. 나중에 소스에 문제가 생겼을 때 이 사용자들이 이 저장소에 방문해 문제를 제거할 수도 있고, 코드 수정본을 올릴 수도 있습니다. package.json의 repository 속성에 저장됩니다.
- keywords: 키워드는 npm 공식 홈페이지에(https://nodejs.com)에서 패키지를 쉽게 찾을 수 있도록 해줍니다. package.json의 keywords 속성에 저장됩니다.
- license: 해당 패키지의 라이선스를 넣으면 됩니다.
npm init 실행이 완료되면 폴더에 다음과 같은 파일이 생성됩니다.
package.json
{
"name": "npmtest",
"version": "0.0.1",
"description": "hello package.json",
"license": "ISC",
"author": "cherry",
"type": "commonjs",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
}
}
scripts 부분은 npm 명령어를 저장해 두는 부분입니다. 콘솔에서 npm run [스크립트 명령어]를 입력하면 해당 명령어가 실행됩니다.
콘솔
$ npm run test
> npmtest@0.0.1 test
> echo "Error: no test specified" && exit 1
"Error: no test specified"
test 스크립트 외에도 scripts 속성에 명령어 여러 개를 등록해두고 사용할 수 있습니다. 보통 start 명령어에 node [파일명]을 저장해두고 npm start로 실행합니다. start나 test 같은 스크립트는 run을 붙이지 않아도 실행됩니다.
이제 패키지를 설치해봅니다. npm install [패키지 이름]을 package.json이 있는 폴더의 콘솔에서 입력하면 됩니다.
콘솔
$ npm install express
added 66 packages, and audited 67 packages in 13s
14 packages are looking for funding
run `npm fund` for details
found 0 vulnerabilities
메시지 중에 WARN이 나오는데 걱정하지 않아도 됩니다. ERROR만이 진짜 에러고 WARN은 단순한 경고일 뿐입니다.
설치한 패키지가 package.json에 기록됩니다.
package.json
{
"name": "npmtest",
"version": "0.0.1",
"description": "hello package.json",
"license": "ISC",
"author": "cherry",
"type": "commonjs",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"dependencies": {
"express": "^5.1.0"
}
}
dependencies 라는 속성이 새로 생겼고, express라는 이름과 함께 설치된 버전이 저장되었습니다.
추가로 node_modules이라는 폴더도 생성되었습니다. 그 안에 설치된 패키지들이 들어 있습니다. 분명히 Express하나만 설치했는데 패키지가 여러 개 들어 있습니다. 이는 Express가 의존하는 패키지들입니다. 패키지 하나가 다른 여러 패키지에 의존하고, 그 패키지들은 또 다른 패키지들에 의존합니다. 이렇게 의존 관계가 복잡하게 얽혀 있어 package.json이 필요한 것입니다.


package-lock.json이라는 파일도 생성되었습니다. 내용을 보면 직접 설치한 express 외에도 node_modules에 들어 있는 패지지들의 정확한 버전과 의존 관계가 담겨 있습니다. npm으로 패키지를 설치, 수정, 삭제할 때마다 패지지들 간의 내부 의존 관계를 이 파일에 저장합니다.
이제 모듈 여러 개를 동시에 설치해보겠습니다. npm install [패키지1] [패키지2] [...]와 같이 패키지들을 나열하면 됩니다.
콘솔
$ npm install morgan cookie-parser express-session
added 15 packages, and audited 82 packages in 5s
14 packages are looking for funding
run `npm fund` for details
found 0 vulnerabilities
설치한 패키지들이 dependencies 속성에 기록됩니다.
{
"name": "npmtest",
"version": "0.0.1",
"description": "hello package.json",
"license": "ISC",
"author": "cherry",
"type": "commonjs",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"dependencies": {
"cookie-parser": "^1.4.7",
"express": "^5.1.0",
"express-session": "^1.18.1",
"morgan": "^1.10.0"
}
}
개발용 패키지를 설치할 수도 있습니다. 실제 배포 시에는 사용되지 않고 개발 중에만 사용되는 패키지들입니다. npm install --save-dev [패키지] [...]로 설치합니다. --save-dev가 개발용 패키지임을 나타냅니다.
nodemon 패키지를 설치해보겠습니다. 소스 코드가 바뀔 때마다 자동으로 노드를 재실행해주는 패키지입니다.
콘솔
$ npm install --save-dev nodemon
added 27 packages, and audited 109 packages in 5s
18 packages are looking for funding
run `npm fund` for details
found 0 vulnerabilities
package.json에 새로운 속성이 생겼습니다. 새로 생긴 devDependencies 속성에서는 개발용 패키지들만 따로 관리합니다.
{
"name": "npmtest",
"version": "0.0.1",
"description": "hello package.json",
"license": "ISC",
"author": "cherry",
"type": "commonjs",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"dependencies": {
"cookie-parser": "^1.4.7",
"express": "^5.1.0",
"express-session": "^1.18.1",
"morgan": "^1.10.0"
},
"devDependencies": {
"nodemon": "^3.1.10"
}
}
npm에는 전역(global) 설치라는 옵션도 있습니다. 패키지를 현재 폴더의 node_modules에 설치하는 것이 아니라 npm이 설치되어 있는 폴더에 설치합니다. 대부분 명령어로 사용하기 위헤 전역 설치합니다.
콘솔
$ npm install --global rimraf
added 41 packages in 16s
14 packages are looking for funding
run `npm fund` for details
rimraf는 리눅스나 맥의 rm -rf 명령어를 윈도에서도 사용할 수 있게 해주는 패키지입니다. rm -rf는 지정한 파일이나 폴더를 지우는 명령어입니다. 전역 설치했으므로 rimraf 명령어를 콘솔에서 사용할 수 있습니다. 전역 설치한 패키지는 package.json에 기록되지 않습니다.rimraf로 node_modules 폴더를 삭제해보겠습니다.
$ rimraf node_modules
현재 폴더 내에는 package.json과 package-lock.json밖에 없는 상태입니다. 설치한 패키지들을 지워버렸지만 package.json에 설치한 패키지 내역들이 들어 있으므로 걱정하지 않아도 됩니다. npm install만 하면 알아서 다시 설치됩니다.즉, node_modules는 언제든지 npm install로 설치할 수 있으므로 node_modules는 보관할 필요가 없다는 점을 알 수 있습니다. 버전 관리 프로그램과 같이 사용할 때도 node_modules는 커밋하지 않습니다. 중요한 파일은 package.json입니다.
'프로그래밍 언어 > NODE JS' 카테고리의 다른 글
| 기타 npm 명령어 (2) | 2025.06.07 |
|---|---|
| 패키지 버전 이해하기 (0) | 2025.06.04 |
| cluster (0) | 2025.05.29 |
| https와 http2 (0) | 2025.05.26 |
| 쿠키와 세션 이해하기 (1) | 2025.05.23 |