npm(Node Package Manager)은 Node.js 플랫폼의 표준 패키지 매니저로, Node.js 설치에 포함되어 있습니다. npm은 JavaScript 및 TypeScript 프로젝트의 의존성을 관리합니다: 라이브러리를 node_modules에 설치하고, 패키지 버전을 업데이트하며, 버전 충돌을 해결합니다. package.json은 메타데이터와 의존성 목록을 포함한 중앙 구성 파일입니다. npm Registry는 가장 큰 패키지 레지스트리입니다. 자세한 내용은 npm Registry에서 확인하세요.
핵심 사항
npm은 2010년 Isaac Schlueter가 Node.js 의존성 관리를 위한 솔루션으로 만들었습니다. 2014년부터 npm은 npm, Inc.에서 관리하며, 2020년 Microsoft/GitHub에 인수되었습니다. 이 도구는 두 부분으로 구성됩니다: 패키지를 설치하고 관리하는 CLI(명령줄)와 registry.npmjs.org에 있는 모든 게시된 모듈의 중앙 저장소인 Registry입니다.
npm Registry는 가장 큰 패키지 레지스트리입니다: 200만 개 이상의 패키지와 월간 100억 회 이상의 다운로드가 있습니다. 각 패키지에는 SemVer 버전, 설명, 의존성, 라이선스 및 저작자 정보가 있습니다. 자체 패키지 게시는 npm publish를 통해 수행합니다. npm은 조직용 범위 패키지(@scope/package), 비공개 레지스트리 및 내장 보안 감사를 지원합니다.
Node.js 버전 18+에는 성능이 향상된 npm 9+, 모노레포용 워크스페이스 및 재설계된 피어 의존성 메커니즘이 포함되어 있습니다. npm 생태계는 서버 측 JavaScript, 프론트엔드(React, Vue, Angular), 모바일 개발(React Native), 빌드 도구(Webpack, Vite) 및 CLI 유틸리티를 포괄합니다. npm은 JavaScript 라이브러리의 주요 배포 채널입니다.
npm install — package.json과 package-lock.json을 읽어 모든 의존성을 node_modules에 설치하는 주요 명령어입니다. 첫 실행 시 npm은 의존성 그래프를 계산하고, 버전 충돌을 해결하며, package-lock.json을 생성합니다. npm install <package> 명령어는 특정 패키지를 설치하고, --save-dev 플래그는 devDependencies에 추가하며, --global은 전역으로 설치합니다.
npx — npm 버전 5.2부터 포함된 패키지 실행기입니다. npx를 사용하면 전역 설치 없이 CLI 유틸리티를 실행할 수 있습니다: npx react-native init 또는 npx create-react-app my-app. npx는 패키지를 임시 캐시에 다운로드하고, 실행하며, 완료 후 정리합니다. npx는 특정 버전의 도구를 실행하는 데도 유용합니다.
npm audit은 npm 데이터베이스에서 알려진 취약점에 대해 의존성 트리를 스캔합니다. 명령어는 심각도 수준(critical, high, moderate)의 보고서를 출력하고 취약한 패키지를 자동으로 업데이트하기 위해 npm audit fix를 권장합니다. npm cache는 다운로드한 패키지를 로컬에 저장합니다. npm cache clean --force는 설치 문제 시 캐시를 지웁니다. npm outdated는 오래된 패키지를 표시합니다.
# npm 기본 명령어
$ npm install
$ npm install react-native-webview --save
$ npm install typescript --save-dev
# 전역 설치 없이 실행
$ npx react-native init MyApp
# 보안 감사
$ npm audit --fix
package.json은 프로젝트 루트에 있는 JSON 파일로, 해당 프로젝트의 메타데이터, 의존성 및 구성을 설명합니다. 필수 필드: name(고유 패키지 이름) 및 version(SemVer 버전, 예: 1.0.0). 파일은 빠른 초기화를 위해 npm init -y로 또는 수동으로 생성합니다.
Semantic Versioning(SemVer)은 MAJOR.MINOR.PATCH 형식의 버전 관리 표준입니다. 주 버전은 호환되지 않는 API 변경 시, 부 버전은 기능 추가 시(하위 호환), 패치는 버그 수정 시 변경됩니다. 버전 앞의 ^ 기호는 부 버전 및 패치 업데이트를 허용하고, ~는 패치 업데이트만 허용합니다.
{
"name": "my-app",
"version": "1.0.0",
"private": true,
"scripts": {
"start": "expo start",
"android": "expo start --android",
"ios": "expo start --ios"
},
"dependencies": {
"react": "^18.3.0",
"react-native": "^0.76.0"
},
"devDependencies": {
"typescript": "^5.5.0",
"@types/react": "^18.3.0"
}
}
| 필드 | 목적 | 예시 값 |
|---|---|---|
| scripts | npm run 실행 명령어 | "start": "node index.js" |
| dependencies | 애플리케이션의 프로덕션 의존성 | "react": "^18.3.0" |
| devDependencies | 개발 및 테스트 도구 | "jest": "^29.7.0" |
| peerDependencies | 라이브러리의 호스트 의존성 | "react": ">=17.0.0" |
| engines | Node.js 버전 요구 사항 | {"node": ">=18.0.0"} |
React Native 프로젝트는 의존성 관리를 위해 npm을 적극적으로 사용합니다. 표준 세트에는 react, react-native, 탐색 라이브러리(React Navigation), HTTP 라이브러리(axios), 상태 관리(Redux, Zustand) 및 UI 컴포넌트가 포함됩니다. npm을 통해 레지스트리에서 수천 개의 호환 가능한 패키지를 설치할 수 있습니다.
npx pod-install — iOS용 React Native에서 네이티브 모듈 설치 후 필수 명령어입니다. npm은 package-lock.json을 기반으로 Podfile.lock을 자동 생성합니다. Expo 프로젝트에서는 npm install 대신 expo install을 사용합니다. 현재 Expo SDK 버전과 호환되는 버전을 선택하기 때문입니다.
버전 충돌은 React Native에서 흔한 문제입니다: react-native-reanimated, react-native-gesture-handler, react-native-safe-area-context는 정렬된 버전이 필요합니다. 해결책은 모든 패키지를 최신 호환 버전으로 업데이트하거나 --legacy-peer-deps를 사용하는 것입니다. package-lock.json은 CocoaPods 및 Gradle을 통해 컴파일되는 네이티브 모듈에 중요합니다.
npm은 Node.js에 포함된 표준 패키지 매니저입니다. 주요 대안: yarn(2016년 Facebook이 개발)과 pnpm(빠름, 하드 링크 사용). npm 5부터 npm과 yarn의 속도 및 기능 차이는 미미합니다. npm 7+는 워크스페이스를 추가하여 모노레포에서 경쟁력을 갖추게 되었습니다.
| 특성 | npm | yarn | pnpm |
|---|---|---|---|
| 출시 연도 | 2010 | 2016 | 2017 |
| 잠금 파일 | package-lock.json | yarn.lock | pnpm-lock.yaml |
| 설치 | 순차적(npm 5+) | 병렬 | 병렬 |
| 디스크 공간 | 표준 | 표준 | 최소(링크) |
| 워크스페이스 | 예(npm 7+) | 예 | 예 |
| Plug'n'Play | 아니오 | 예 | 아니오 |
State of JS 2025에 따르면: 62%의 개발자가 npm을 사용하고, 35%가 yarn(주로 기존 프로젝트 및 PnP 애호가), 3%가 pnpm을 사용합니다. React Native 프로젝트의 경우 두 도구 모두 동등하게 viable 하지만, npm은 Expo SDK 50+ 및 새로운 React Native 초기화 프로젝트에서 더 일반적입니다.
yarn은 더 성숙한 워크스페이스 구현과 Plug'n'Play 덕분에 매우 큰 모노레포(100개 이상 패키지)에서 우위를 유지합니다. pnpm은 글로벌 저장소에 대한 하드 링크를 통한 디스크 공간 절약에서 승리합니다. 매니저 선택은 팀 선호도와 인프라에 따라 달라집니다.
자주 묻는 질문
npm install은 package-lock.json을 업데이트하고 의미론적 범위 내에서 새로운 부 버전을 설치할 수 있습니다. npm ci(Clean Install)는 node_modules를 제거하고 package-lock.json에서 엄격히 패키지를 설치하며 업데이트하지 않습니다. npm ci는 더 빠르며 CI/CD에서 사용되고 모든 머신에서 동일한 환경을 보장합니다. package-lock.json이 없으면 npm ci는 오류를 발생시킵니다.
npm 7부터 피어 의존성 충돌은 빌드 오류를 발생시킵니다. 해결책: npm update를 통해 모든 패키지를 호환 버전으로 업데이트하거나, npm 6 모드용 --legacy-peer-deps 플래그를 사용하거나, package.json에 overrides 섹션을 추가하여 특정 패키지 버전을 강제합니다. 가장 좋은 방법은 의존성을 호환 버전으로 업데이트하는 것입니다.
npm audit은 npm Security Advisory 데이터베이스에서 알려진 취약점에 대해 의존성 트리를 스캔합니다. 명령어는 심각도 수준(critical, high, moderate, low)의 보고서를 출력하고 취약한 패키지를 안전한 버전으로 자동 업데이트하기 위해 npm audit fix를 권장합니다. 정기적으로 npm audit을 실행하는 것은 JavaScript 프로젝트의 기본 보안 관행입니다.
npm 워크스페이스를 사용하면 단일 저장소에서 여러 패키지를 관리할 수 있습니다. 루트 package.json에 "workspaces": ["packages/*"] 필드를 추가하세요. 이점: 공유 node_modules에 모든 의존성의 단일 설치, 로컬 패키지 간 자동 심볼릭 링크, 루트에서 모든 패키지의 스크립트 실행, 버전 중복 제거.
package-lock.json은 모든 의존성과 그 전이 패키지의 정확한 버전을 잠급니다. 이것이 없으면 다른 개발자와 CI 서버가 의미론적 범위 내에서 다른 버전의 라이브러리를 가져와 "제 컴퓨터에서는 작동합니다" 오류가 발생할 수 있습니다. 잠금 파일을 커밋하면 재현 가능한 빌드와 모든 환경에서 동일한 동작이 보장됩니다.
요약
턴키 방식의 모바일 애플리케이션을 개발해 드립니다
IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.