
Node Package Manager의 약어로, 애플리케이션 개발에 필요한 모듈을 쉽게 다운받을 수 있게 해주는 도구이다.
자주 사용하는 기능을 모듈화한 후, 다른 프로젝트에서 모듈을 다운받아 사용할 수 있도록 모듈 저장소에 공유한다.
자주 사용하는 기능을 모듈화하면 JavaScript 파일(.js) 형태로 관리된다.
모듈 저장소의 대표적인 예시로 npmjs.com이 있다.
이때, npm이 저장소에 공유된 모듈을 쉽게 다운받을 수 있게 해준다.
📝모듈, 라이브러리, 패키지는 큰 의미에서 같은 용어라고 볼 수 있다.
npm은 Node.js 설치 시 자동으로 설치가 된다.
따라서, npm을 사용하기 위해서는 Node.js를 설치해야한다.

명령 프롬프트에서 node -v 와 npm -v를 입력하여 버전이 정상적으로 출력된다면 Node.js와 npm이 설치된 것이다.
Node.js는 Chrome V8 JavaScript 엔진으로 빌드된 JavaScript 런타임 환경이다.
Node.js 환경에서 실행하면 백엔드 애플리케이션이 된다. 
npmjs.com은 npm 모듈을 공유하는 사이트이다.
해당 사이트에서 공유된 모듈의 정보와 설치 명령어 등 다양한 정보를 찾을 수 있다.

npm install 패키지명 명령어를 터미널 창에 입력하면, 패키지가 설치된다.
위 명령어는 날짜와 관련된 dayjs 패키지를 설치한다.
이때, 패키지 설치와 동시에 node_modules 디렉토리와 package-lock.json 파일이 생성된다.

package.json 파일의 dependencies 속성으로 dayjs 패키지가 들어간 것을 확인할 수 있다.
const dayjs = require('dayjs');
console.log(dayjs().format('YYYY-MM-DD')); // 2025-01-18

node_modules 디렉토리 안에는 다운받은 패키지가 존재한다.
require() 메서드로 모듈을 가져올 때, 기본적으로 node_modules 디렉토리를 참고한다.
package.json파일은 프로젝트에 대한 정보를 갖고 있는 파일이다.
dependencies와 같은 속성을 활용하여 프로젝트가 사용하는 라이브러리를 관리한다.
package.json 파일은 직접 작성할 수도 있고, npm init 명령어를 사용해서 자동으로 package.json 파일을 생성할 수 있다.
name: 프로젝트 이름으로 가장 중요하다.
version: 프로젝트 버전을 정의하며, 주로 3단계 버전을 사용한다. ex) 1.0.0
description: 프로젝트 설명을 기술한다.
keywords: 프로젝트를 검색할 때 참조되는 키워드이다.
private: true로 설정하면 npmjs 모듈 저장소에 공유되지 않도록 막아준다. 즉, 소스를 공유하지 않겠다는 뜻이다.
main: 프로그램의 기본 진입점이다.
scripts: 프로젝트에서 자주 실행되는 명령어를 scripts로 작성해두면 npm 명령어로 지정한 명령어를 실행할 수 있다.
author: 프로그램의 제작자 이름을 지정한다.
license: 패키지에 대한 라이센스를 지정하여 사람들이 패키지를 사용할 수 있는 방법과 패키지에 대한 제한 사항을 알 수 있도록 해야 한다.
dependencies: 프로젝트에서 사용하는 모듈을 기술하는 부분이다. 이 프로젝트가 어떤 모듈을 사용하는지 한눈에 볼 수 있다.
devDependencies: 개발할 때만 사용하는 모듈을 관리한다.
{
"name": "learnnpm",
"version": "1.0.0",
"main": "index.js",
"scripts": {
"start": "echo hello world",
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"description": "",
"dependencies": {
"dayjs": "^1.11.13"
}
}
프로젝트에서 자주 사용하는 명령어를 package.json의 scripts 속성에 정의해두면 npm run 스크립트이름 으로 실행할 수 있다.
프로젝트를 실행하거나 빌드할 때 자주 사용한다.
📝echo는 터미널에 문자열을 출력하는 명령어이다.

start 스크립트의 경우 npm run start에서 run을 생략하고 npm start만으로도 바로 실행 가능하다.
test 스크립트도 마찬가지로 npm test로 실행 가능하다.

날짜 관련 라이브러리인 moment를 설치하면, dependencies에 해당 라이브러리가 기술된다.
반면, 개발을 할 때만 사용할 nodemon 라이브러리는 --save-dev 명령어를 붙여서 npm install --save-dev nodemon으로 설치를 하면, devDependencies 속성에 기술이 된다.

이렇게 개발과 서비스 운영 시에 필요한 모듈로 나눌 수 있다.
실제로 서비스를 운영할 때는 devDependencies에 기술된 모듈은 필요 없기 때문에, 해당 모듈은 배포할 필요가 없다.
따라서, npm install --production 명령어를 입력하면 devDependencies에 있는 모듈을 제외하고 dependencies에 있는 모듈만 설치한다. 따라서, node_modules 디렉토리에는 dependencies에 기술된 모듈만 설치되어있다.
node_modules폴더는 프로그램에서 필요로 하는 라이브러리가 실제로 설치된 경로이다.
node_modules 디렉토리에는 굉장히 많은 라이브러리가 있기에 모든 라이브러리를 깃헙 저장소에 저장을 한다는 건 매우 비효율적이다.
따라서 소스를 옮길 때는 node_modules는 옮기지 않아도 된다.
npm install 명령어를 입력하면, package.json 파일의 dependencies와 devDependencies를 참고하여 node_modules 디렉토리를 만들어 디렉토리 안에 프로젝트에 필요한 모듈을 전부 설치한다.

node_modules 디렉토리를 지웠다가 npm install 명령어를 입력해보자.

npm install 명령어를 입력하면, 프로젝트에 필요한 모든 모듈을 다운받은 node_modules 디렉토리가 생성된다.
프로젝트에서 사용하는 모듈의 버전이 꼬였거나 에러가 발생할 경우, node_modules 디렉토리와 package-lock.json 파일을 삭제하고 npm install 명령어를 입력해서 모듈을 다시 설치해주면 된다.
프로젝트에 설치된 모듈들의 의존성 정보를 기록하고 있으며,
package-lock.json파일을 우선적으로 참고하여node_modules디렉토리 안에 모듈을 다운 받는다. 만약package-lock.json파일이 없다면,package.json파일의dependencies와devDependencies를 참고한다.
프로젝트에서 설치된 라이브러리는 또 다른 라이브러리를 사용하고 있을 수 있다.
따라서, 라이브러리들 간에는 의존 관계가 있다.
다시말해, 하위 라이브러리가 있어야 상위 라이브러리가 동작할 수 있다는 것이다.
이때, 하위 라이브러리는 다른 라이브러리에서 사용되는 라이브러리이다.

package-lock.json 파일에서 requires 속성에 있는 항목들은 현재 라이브러리가 필요로 하는 하위 라이브러리이다.
requires 속성에 적힌 하위 라이브러리가 설치 되지 않으면, 상위 라이브러리는 제대로 동작하지 않는다.
위 코드를 보면, body-parser이라는 라이브러리는 debug와 bytes 라이브러리를 사용한다. 따라서, node_modules 디렉토리 안에는 body-parser, debug, bytes 라이브러리 전부를 다운받는다.
npm init: 새로운 프로젝트를 시작할 때 사용하는 명령어로 package.json 파일을 생성한다.
npm init -y: 기본값이 입력된 package.json 파일을 생성할 수 있다.
npm install <패키지명> (축약 i): 패키지를 설치하는 명령어이다. (로컬설치)
npm install <패키지명@버전>: 특정 버전의 패키지를 설치할 수 있다.
npm i dayjs@1.10.7
npm install --save 축약 -S: --save 옵션을 사용하면 설치된 모듈이 dependencies에 기술된다. (npm@5 버전 이후부터는 디폴트로 --save 옵션이 적용됨.)
npm install --save-dev 축약 -D: devDependencies 속성에 설치된 모듈이 기술된다.
npm install <패키지명1> <패키지명2>: 여러개의 패키지를 설치할 수 있다.
npm i nodemon eslint --save-dev
npm i nodemon eslint --D
npm install -g <패키지명>: 패키지를 전역 설치 할 수 있다. (또는 --global)
npm install: 우선적으로 package-lock.json 파일을 참고하고, 해당 파일이 없다면 package.json의 dependencies와 devDependencies를 참고하여 모든 패키지를 설치한다.
npm install --production: package.json에 설정된 모든 패키지를 설치한다. (devDependencies 제외)
npm uninstall <패키지명>: 로컬 패키지를 삭제한다.
npm uninstall -g <패키지명>: 전역 패키지를 삭제한다.
npm update <패키지명>: 설치한 패키지를 업데이트 한다.

update 명령어를 사용해서 패키지의 버전을 업데이트 하는 것 보다, uninstall해서 다시 패키지를 install하는 방법이 더 편리할 수 있다.
npm root: 로컬 패키지가 설치된 디렉토리를 확인한다. 즉, node_modules 디렉토리의 절대경로를 확인할 수 있다.
npm root -g: 전역 패키지가 설치된 디렉토리의 절대경로를 확인할 수 있다.
npm ls: 설치된 로컬 패키지를 확인한다.
npm ls --depth=2: 설치된 로컬 패키지 뿐만 아니라, 설치된 로컬 패키지가 의존하는 다른 패키지까지 보여준다.
npm ls -g: 설치된 전역 패키지를 확인한다.
npm start: package.json 파일의 scripts 속성에 있는 start를 실행한다.
npm run <스크립트 이름>: package.json 파일의 scripts 속성에 있는 start외 스크립트를 실행한다. 스크립트 명령어를 사용해서 서버를 실행하거나 빌드하는 작업을 수행할 수 있다.
node명령어와 같다.JavaScript파일을Node.js환경에서 실행시켜주는 라이브러리이다.
node 명령어와는 다르게, JavaScript 파일에 변경사항이 생기면 자동으로 감지해서 재시행한다.
nodemon은 CLI로 기능을 제공하기 때문에 터미널에서 명령어를 적어 실행할 수 있다.
nodemon 실행하기node_modules 디렉토리에서 .bin 디렉토리 안에 있는 nodemon 명령어를 통해 nodemon을 실행할 수 있다. 그리고 Ctrl + c를 통해서 nodemon 실행을 종료할 수 있다.
현재
nodemon라이브러리는 로컬에 설치되어 있기 때문에nodemon명령어를 실행하기 위해서는, 반드시nodemon명령어가 저장된 파일에 접근해서 실행해야 한다.

🚀 자주 사용하는 명령어를 package.json 파일의 scripts 속성에 정의해두면 npm run 스크립트이름으로 명령어를 실행할 수 있다.


nodemon 실행하기CLI로 기능을 제공하는 라이브러리는 보통 전역 환경에 설치해서 어디서든 사용할 수 있게 한다.
npm install -g nodemon

nodemon 패키지를 전역 환경에 설치했기 때문에, nodemon 명령어가 저장된 디렉토리가 아닌, 다른 디렉토리에서도 nodemon 명령어를 실행 가능하다.
전역 환경에 설치를 하는 경우에는 CLI를 제공하는 모듈인 경우이다.
예를 들어 nodemon, vue-cli와 같이 터미널에서 라이브러리의 명령어를 인식하게끔 설정하기 위해서 전역 설치를 한다.
📝CLI는 Command Line Interface로 터미널(명령 프롬프트, 쉘)에서 실행하는 명령어를 의미한다.
기본적으로
package.json파일에 기술된 모듈의 버전은 세 자리 수로 구분이 된다.
세 자리 수로 된 버전 표기법은 시멘틱 버저닝(Semantic Versioning) 규칙을 따른다.
버전은 [MAJOR, MINOR, PATCH]로 구성되어 있다.
MAJOR: 소프트웨어의 큰 변화가 있을 때 MAJOR 부분을 변경한 후에 배포한다. 기존 API 추가/변경/삭제 등, 이전 버전과 호환이 안될 수 있음.MINOR: 기능추가, 이전 버전과 호환됨.PATCH: 버그 수정, 이전 버전과 호환됨.npm Docs package.json 속성 소개 문서: https://docs.npmjs.com/cli/v11/configuring-npm/package-json
npm Docs 명령어 소개 문서: https://docs.npmjs.com/cli/v11/commands/npm