npm이란?
npm(Node Package Manager)은 Node.js 환경에서 사용하는 패키지 관리자이다.
패키지 관리자는 소프트웨어 패키지(모듈)를 쉽게 설치하고 관리할 수 있도록 도와주는 도구를 말한다.
npm을 사용하면 자바스크립트 애플리케이션을 개발할 때 필요한 다양한 오픈 소스 라이브러리와 도구를 쉽게 설치하고 관리할 수 있다.
Node.js를 설치하면 npm도 함께 설치된다.
Node.js와 패키지
- Node.js: 서버 측에서 JavaScript를 실행할 수 있게 해주는 런타임 환경이다.
즉, 브라우저가 아닌 서버에서도 JavaScript 코드를 실행할 수 있게 해 준다. - 패키지: 특정 기능을 수행하는 코드 묶음이다.
예를 들어, 데이터베이스에 연결하거나 파일 시스템을 조작하는 기능을 제공하는 라이브러리 등 특정 기능을 구현하는 라이브러리나 모듈을 뜻한다.
패키지 관리자의 역할
패키지 관리자는 이러한 패키지를 쉽게 설치하고, 업데이트하고, 제거할 수 있도록 도와준다. 프로젝트에서 사용되는 모든 패키지와 그 버전을 관리한다.
- 설치: 프로젝트에서 필요한 패키지를 설치한다.
- 업데이트: 설치된 패키지를 최신 버전으로 업데이트한다.
- 의존성 관리: 프로젝트에서 사용하는 모든 패키지와 그 버전을 관리한다.
- 스크립트 실행: 프로젝트 내의 다양한 작업을 스크립트로 정의하고 실행할 수 있다.
npm의 주요 기능
- npm 레지스트리: npm은 중앙 저장소(npm registry)에서 다양한 패키지를 제공하며, 이를 통해 필요한 패키지를 다운로드할 수 있다.
- 명령어: 다양한 npm 명령어를 통해 패키지를 설치하고 관리할 수 있다. 예를 들어, npm install 명령어를 사용해 특정 패키지를 설치할 수 있다.
npm 기본 명령어
npm init: 새로운 Node.js 프로젝트를 시작할 때 사용한다.
이 명령어를 실행하면 프로젝트의 메타데이터를 담은 package.json 파일을 생성할 수 있다.
npm init
npm install: 패키지를 설치할 때 사용한다. 예를 들어 'gh-pages'라는 패키지를 설치하려면 다음과 같이 입력한다.
npm install gh-pages
이 명령어를 실행하면 node_modules 폴더에 패키지가 설치되고, package.json 파일에 패키지 정보가 추가된다.
npm install <패키지>@<버전>: 특정 버전의 패키지를 설치할 때 사용한다.
npm install react-router-dom@6
npm uninstall: 패키지를 제거할 때 사용한다.
npm uninstall gh-pages
npm update: 설치된 패키지들을 최신 버전으로 업데이트한다.
npm update
npm list: 현재 프로젝트에 설치된 모든 패키지를 나열한다.
npm list
package.json이란?
package.json은 생성한 프로젝트의 메타정보와 프로젝트가 의존하고 있는 모듈들에 대한 정보들을 json 형태로 모아놓은 파일이다.
프로젝트 폴더에서 npm init 명령어를 실행하면 대화형 설정을 통해 package.json 파일을 생성할 수 있다.
npm init
또는, 간단한 설정을 사용하고 싶다면 -y 옵션을 추가하여 기본 설정으로 package.json 파일을 생성할 수 있다.
npm init -y
package.json 파일은 JSON 형식으로 작성되며, 여러 가지 속성을 포함할 수 있다.
{
"name": "my-project", // 프로젝트 이름
"version": "1.0.0", // 프로젝트 버전
"description": "A simple project", // 프로젝트 설명
"main": "index.js", // 진입점 파일
"scripts": { // 스크립트 정의
"start": "node index.js",
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "John Doe", // 작성자 정보
"license": "MIT", // 라이선스 정보
"dependencies": { // 프로젝트가 필요로 하는 패키지
"express": "^4.17.1"
},
"devDependencies": { // 개발 환경에서만 필요로 하는 패키지
"jest": "^26.6.3"
}
}
프로젝트 메타정보
name: 프로젝트의 이름
version: 프로젝트의 버전
main: 애플리케이션의 진입점 파일 지정
description: 프로젝트에 대한 설명
scripts: 프로젝트에서 사용할 수 있는 명령어들을 정의. 예) npm start 명령어를 실행하면 node index.js가 실행된다.
- start: 애플리케이션을 시작하는 명령어
- test: 테스트 스크립트를 정의하는 명령어
author: 프로젝트 작성자의 이름
license: 프로젝트의 라이선스 정보를 지정
의존성 관리
dependencies: 프로젝트 실행에 필요한 패키지들과 그 버전들 정의
devDependencies: 개발 중에만 필요한 패키지들과 그 버전들 정의 (예: 테스트 프레임워크, 빌드 도구 등)
환경 설정 및 일관성
package.json 파일을 통해 모든 개발자들이 동일한 버전의 패키지를 사용하여 개발할 수 있게 된다.
package-lock.json package.json에 명시된 패키지와 그 패키지의 의존성에 대한 정확한 버전 정보를 기록한다. 이를 통해, 프로젝트를 다른 환경에서 설치할 때도 동일한 버전의 패키지를 설치할 수 있다.
패키지의 정확한 버전과 해시값을 기록하므로, 의존성의 무결성을 검증할 수 있으며, 이를 통해 패키지가 예상치 못한 버전으로 변경되거나 악의적인 코드가 포함되는 것을 방지한다.
설치 및 배포의 편리함
새로운 팀원이 프로젝트에 참여하거나 새로운 개발 환경을 설정할 때, package.json만 있으면 복잡한 설정 과정 없이 npm install 명령어로 필요한 모든 패키지를 한 번에 설치할 수 있어 개발 환경을 빠르고 쉽게 설정할 수 있다.
스크립트 자동화
scripts 필드를 사용하여 자주 사용하는 명령어(예: 빌드, 테스트, 린트 등)를 정의하고, npm run <script-name> 명령어로 실행할 수 있다.
node_modules란?
npm을 통해 프로젝트 생성 시 node_modules라는 디렉터리가 생성된다.
package.json 파일에 정의된 의존성 패키지들이 node_modules 디렉터리에 설치되는데,
이 디렉터리는 package.json에 명시된 직접 의존성뿐만 아니라, 그 의존성들이 필요로 하는 모든 하위 의존성들도 포함된다.
(package.json 파일에 명시된 패키지들은 현 프로젝트에서 직접 사용하는 패키지들이며,
어떠한 패키지들은 자신이 제대로 동작하기 위해 다른 패키지들이 필요할 수 있다. 이것을 하위 의존성이라 부른다.)
npm으로 새로운 패키지를 설치하면, 해당 패키지와 그 패키지가 의존하는 모든 모듈이 node_modules 디렉터리에 추가됨과 동시에, package.json과 package-lock.json (또는 yarn.lock) 파일이 업데이트되어, 설치된 패키지들의 버전 및 의존성 정보가 반영된다.
node_modules 폴더는 일반적으로 Git에 커밋하지 않는 것이 좋다.
이유는 폴더의 크기가 크고, 패키지 설치에 필요한 정보는 package.json과 package-lock.json에 충분히 담겨 있기 때문에
.gitignore 파일에 node_modules/를 추가하여 Git이 이 폴더를 추적하지 않도록 할 수 있다.
만약 node_modules 폴더를 삭제해도, package.json과 package-lock.json 파일이 있으면 npm install 명령어를 통해 의존성 패키지를 다시 설치할 수 있고, 이 명령어는 필요한 모든 패키지를 node_modules 디렉터리에 복원한다.
'기초 지식' 카테고리의 다른 글
인증(인증, Authentication)과 인가(권한 부여, Authorization) (0) | 2024.08.07 |
---|---|
쿼리 스트링(Query String)이란? (0) | 2024.07.31 |
HTTP 상태 코드 정리 (0) | 2024.07.31 |
HTTP란? / HTTP와 HTTPS (0) | 2024.07.31 |
Web API란? (엔드포인트, 메서드: GET, POST, PUT, DELETE, 헤더, 바디) (0) | 2024.07.31 |