3️⃣ NPM (Node Package Manager) 심층 분석 📦
이전 챕터에서 Node.js가 제공하는 핵심 모듈들을 살펴보았습니다. 하지만 실제 애플리케이션을 개발하다 보면 핵심 모듈만으로는 부족한 경우가 많습니다. 특정 데이터베이스와의 연동, 복잡한 날짜/시간 처리, HTTP 요청을 더 쉽게 보내는 방법 등 다양한 기능들이 필요해집니다.
이때 등장하는 것이 바로 NPM (Node Package Manager) 입니다. NPM은 다음과 같은 주요 역할을 합니다.
- 패키지 저장소 (Registry): 전 세계 개발자들이 만든 수많은 Node.js 패키지(라이브러리 또는 모듈)가 공개적으로 저장되어 있는 거대한 온라인 데이터베이스입니다. 필요한 기능을 가진 패키지를 검색하고 다운로드할 수 있습니다.
- 명령줄 인터페이스 (CLI - Command Line Interface): 터미널에서 npm 명령어를 사용하여 패키지를 설치, 업데이트, 삭제하고, 프로젝트의 의존성을 관리하며, 스크립트를 실행하는 등의 작업을 수행할 수 있는 도구입니다.
- 의존성 관리 (Dependency Management): 내 프로젝트가 어떤 패키지들을 필요로 하고, 그 패키지들의 특정 버전은 무엇인지 등을 관리해줍니다. 이를 통해 프로젝트의 일관성과 재현성을 보장합니다.
Java 개발자분들께는 Maven이나 Gradle과 매우 유사한 역할을 한다고 생각하시면 이해가 빠르실 겁니다. Maven이 pom.xml을 통해 의존성을 관리하고 Maven Central Repository에서 라이브러리를 가져오는 것처럼, NPM은 package.json 파일을 통해 의존성을 관리하고 NPM Registry에서 패키지를 가져옵니다.
이 챕터에서는 NPM을 효과적으로 사용하는 방법, 특히 프로젝트의 "설계도"와 같은 package.json 파일의 중요성에 대해 깊이 있게 다루겠습니다.
package.json의 역할과 중요성 (Java의 pom.xml 또는 build.gradle과 유사)
Node.js 프로젝트를 시작할 때 가장 먼저 만들게 되는 파일 중 하나가 바로 package.json 입니다. 이 파일은 해당 프로젝트에 대한 모든 메타데이터(metadata) 를 담고 있는 JSON 형식의 파일입니다. 프로젝트의 이름, 버전, 설명뿐만 아니라, 프로젝트가 의존하고 있는 다른 패키지들의 목록과 버전, 그리고 프로젝트를 위한 다양한 스크립트 명령어 등을 정의합니다.
package.json 파일의 주요 필드:
- name: 패키지(프로젝트)의 이름입니다. 소문자로 작성하며, URL 일부로 사용될 수 있으므로 URL에 적합한 문자로 구성해야 합니다. (필수)
- version: 패키지의 버전입니다. SemVer (Semantic Versioning) (유의적 버전 명세: Major.Minor.Patch) 규칙을 따르는 것이 일반적입니다. (필수)
- description: 패키지에 대한 간략한 설명입니다. NPM 검색 결과 등에 표시됩니다.
- main: 패키지의 진입점(entry point)이 되는 파일의 경로입니다. 다른 프로젝트에서 이 패키지를 require() 할 때 로드될 파일을 지정합니다. (예: "main": "index.js") 기본값은 index.js입니다.
- scripts: 프로젝트에서 자주 사용하는 명령어를 스크립트로 정의해두고 npm run <script-name> 형태로 실행할 수 있게 합니다. (예: 테스트 실행, 빌드, 서버 시작 등)
JSON
"scripts": { "start": "node server.js", "test": "jest", "build": "webpack --config webpack.config.js" } - dependencies: 프로젝트가 프로덕션 환경(실제 서비스 환경)에서 실행될 때 필요한 패키지들의 목록과 버전입니다. npm install <package-name> (또는 npm install <package-name> --save-prod, --save도 가능) 명령으로 설치하면 이 목록에 추가됩니다.
- devDependencies: 프로젝트를 개발하는 동안에만 필요한 패키지들의 목록과 버전입니다. 예를 들어 테스트 도구(Jest, Mocha), 코드 린터(ESLint), 빌드 도구(Webpack, Babel) 등이 여기에 해당됩니다. npm install <package-name> --save-dev (또는 -D) 명령으로 설치하면 이 목록에 추가됩니다. 이 패키지들은 프로덕션 환경에는 포함되지 않습니다.
- author: 패키지 작성자 정보입니다. (이름, 이메일, 웹사이트 등)
- license: 패키지의 라이선스 정보입니다. (예: "MIT", "ISC")
- keywords: NPM에서 패키지를 검색할 때 사용될 키워드 배열입니다.
- repository: 프로젝트의 소스 코드 저장소 정보입니다. (Git, SVN 등)
JSON
"repository": { "type": "git", "url": "https://github.com/username/my-project.git" } - bugs: 버그 리포트를 위한 URL이나 이메일 주소입니다.
- private: true로 설정하면 해당 패키지를 NPM Registry에 실수로 공개(publish)하는 것을 방지합니다. (애플리케이션 프로젝트의 경우 보통 true로 설정합니다.)
package.json 파일 생성하기:
package.json 파일을 수동으로 만들 수도 있지만, 보통 npm init 명령어를 사용하여 대화형으로 생성합니다.
- 프로젝트 폴더를 만들고 해당 폴더로 이동합니다.
Bash
mkdir my-node-project cd my-node-project - 터미널에서 다음 명령어를 실행합니다.
그러면 프로젝트 이름, 버전, 설명 등을 묻는 프롬프트가 나타납니다. 각 질문에 답변하거나 Enter 키를 눌러 기본값을 사용하면 됩니다.Bash
npm init - 모든 질문에 기본값을 사용하고 싶다면 -y 또는 --yes 플래그를 추가합니다.
Bash
npm init -y
이렇게 생성된 package.json 파일은 프로젝트의 "신분증"과 같으며, 다른 개발자와 협업하거나 프로젝트를 다른 환경으로 이전할 때 매우 중요한 역할을 합니다. 이 파일만 있으면 npm install 명령 한 번으로 프로젝트에 필요한 모든 의존성 패키지들을 자동으로 설치할 수 있습니다.
Java 개발자를 위한 비유:
- package.json의 name, version, description 등은 pom.xml의 <groupId>, <artifactId>, <version>, <name>, <description> 등과 유사합니다.
- dependencies는 pom.xml의 <dependencies> 섹션과 정확히 일치합니다.
- devDependencies는 pom.xml에서 <scope>test</scope> 등으로 지정된 의존성과 유사한 개념으로 볼 수 있습니다 (개발/빌드 시에만 사용).
- scripts는 Maven의 build lifecycle이나 plugin goals를 간편하게 실행하는 별칭과 비슷하다고 생각할 수 있습니다.
package.json 파일을 잘 이해하고 관리하는 것은 Node.js 프로젝트의 기본이자 핵심입니다.