npm Reference
npm 패키지 매니저 레퍼런스
npm Reference 소개
npm 레퍼런스는 모든 JavaScript 개발자가 일상 워크플로에서 사용하는 Node Package Manager 명령어와 설정을 다루는 포괄적인 치트 시트입니다. 설치 섹션은 package.json 생성을 위한 npm init과 npm init -y, 전체 의존성 설치를 위한 npm install(npm i), 특정 패키지 추가를 위한 npm i express, 개발 의존성을 위한 npm i -D typescript, 범위 접두사 없이 정확한 버전으로 고정하는 npm install --save-exact, 전역 도구를 위한 npm install -g, 패키지 제거를 위한 npm uninstall, CI/CD 파이프라인에서 잠금 파일 기반 클린 설치를 위한 npm ci를 문서화합니다.
스크립트 섹션은 package.json 스크립트가 실제로 어떻게 동작하는지를 다룹니다: 이름 있는 스크립트를 실행하는 npm run build/test/dev, run 키워드를 생략하는 npm start와 npm test 단축 별칭, 이름 있는 스크립트 전후에 자동으로 실행되는 pre/post 스크립트 훅(prebuild, postbuild), 전역 설치 없이 패키지를 실행하는 npx(npx create-react-app, npx ts-node), 전체 프로젝트 자동화 파이프라인을 정의하는 scripts 필드 구조를 다룹니다. 패키지 섹션은 scoped 패키지 지원을 포함한 npm publish, 설치 가능한 tarball을 만드는 npm pack, 로컬 라이브러리 개발 워크플로를 위한 npm link, 레지스트리 메타데이터를 검사하는 npm info를 문서화합니다.
버전 관리와 보안 주제가 레퍼런스를 완성합니다. 시맨틱 버전 범위는 캐럿(^1.2.3 — 마이너·패치 업데이트 허용), 틸드(~1.2.3 — 패치만 허용), 정확한 버전 고정으로 설명됩니다. npm outdated는 더 새로운 버전이 있는 패키지를 표시하고, npm update는 허용된 업그레이드를 적용합니다. 설정은 .npmrc 설정(registry, save-exact, engine-strict)과 npm config 명령어로 다룹니다. 보안 섹션은 의존성 취약점 검사를 위한 npm audit, 자동 수정을 위한 npm audit fix, 재현 가능한 빌드를 보장하는 package-lock.json의 역할을 설명합니다. 이 레퍼런스는 프론트엔드 개발자, 풀스택 엔지니어, Node.js 프로젝트를 관리하는 DevOps 엔지니어가 사용합니다.
주요 기능
- npm install 변형 — 일반, --save-exact, -D(devDeps), -g(전역), CI용 npm ci
- pre/post 훅(prebuild, postbuild)을 사용한 npm run 스크립트와 라이프사이클 자동화
- 전역 설치 없이 패키지를 즉시 실행하는 npx
- scripts 필드 구조 — dev, build, start, lint, test 파이프라인 정의
- 패키지 저작과 로컬 개발 워크플로를 위한 npm publish, npm pack, npm link
- 시맨틱 버저닝 — 캐럿(^), 틸드(~), 정확한 버전, 범위, x-와일드카드 문법
- npm outdated, npm update, 레지스트리 메타데이터 검사를 위한 npm info
- CVE 스캔과 자동 취약점 수정을 위한 npm audit과 npm audit fix
자주 묻는 질문
npm install과 npm ci의 차이는 무엇인가요?
npm install은 package.json을 읽고 semver 범위와 일치하는 최신 버전을 설치하며, 버전이 변경되면 package-lock.json을 업데이트합니다. npm ci는 먼저 node_modules를 삭제한 후 어떤 해결도 없이 package-lock.json에 기록된 정확한 것을 설치하며, 잠금 파일과 package.json이 동기화되지 않으면 실패합니다. CI/CD 파이프라인과 Docker 빌드에서는 재현 가능하고 빠른 설치를 위해 npm ci를 사용하세요. 패키지를 업데이트하거나 추가할 때는 로컬에서 npm install을 사용하세요.
dependencies와 devDependencies의 차이는 무엇인가요?
dependencies는 코드가 프로덕션에서 실행될 때 런타임에 필요한 패키지입니다. devDependencies는 개발과 빌드 중에만 필요합니다 — 타입 정의, 린터, 테스트 프레임워크, 번들러, 컴파일러 등입니다. NODE_ENV=production으로 npm install을 실행하거나 npm install --production을 사용하면 devDependencies를 건너뜁니다. 런타임 패키지는 npm i package로, 개발 도구는 npm i -D package로 추가하세요.
package.json 버전에서 캐럿(^)은 무엇을 의미하나요?
캐럿 ^는 가장 왼쪽의 0이 아닌 자리를 변경하지 않는 업데이트를 허용합니다. ^1.2.3은 >=1.2.3 <2.0.0을 의미합니다 — 메이저 버전 1 내의 모든 마이너 또는 패치 업데이트. ^0.2.3은 >=0.2.3 <0.3.0을 의미합니다. 틸드 ~는 더 보수적입니다: ~1.2.3은 >=1.2.3 <1.3.0으로 패치 업데이트만 허용합니다. 캐럿을 완전히 생략하려면 --save-exact를 사용하거나 .npmrc에 save-exact=true를 설정하세요.
npx는 npm install -g와 어떻게 다른가요?
npm install -g는 패키지를 전역 node_modules 디렉토리에 영구적으로 설치하고 바이너리를 PATH에 추가합니다. npx는 설치하지 않고 패키지를 임시로 다운로드해서 실행하고 버립니다. npx는 항상 레지스트리에서 최신 버전(또는 지정된 버전)을 가져오므로 항상 새 복사본을 얻습니다. create-react-app 같은 스캐폴딩 도구나 일회성 CLI 작업에는 npx를 사용하세요. typescript나 nodemon 같이 반복적으로 실행하는 도구에는 -g를 사용하세요.
package-lock.json이란 무엇이고 커밋해야 하나요?
package-lock.json은 설치된 모든 패키지와 그 전이 의존성의 정확히 해결된 버전, 다운로드 URL, 무결성 해시를 기록합니다. npm ci가 모든 머신에서 정확히 같은 의존성 트리를 설치하도록 보장합니다. 애플리케이션의 경우 항상 package-lock.json을 커밋해야 합니다 — 빌드를 재현 가능하게 만드는 것이 바로 이것입니다. npm에 게시되는 라이브러리의 경우 커뮤니티 논쟁이 있지만, 현대적 지침은 라이브러리라도 저장소에 커밋하는 것입니다.
npm audit을 실행하고 취약점을 수정하는 방법은?
npm audit을 실행해 설치된 의존성을 npm 권고 데이터베이스와 비교하고 심각도(critical, high, moderate, low)와 함께 취약점 목록을 확인합니다. npm audit fix를 실행하면 semver 제약 조건 내에서 패키지를 최소 안전 버전으로 자동 업그레이드합니다. 수정에 호환성이 깨지는 메이저 버전 변경이 필요한 경우 npm audit fix가 알려주지만 적용하지 않습니다 — npm audit fix --force를 사용해 메이저 버전 업그레이드를 적용하되, 코드를 손상시킬 수 있으므로 변경 사항을 신중하게 검토하세요.
npm의 pre/post 스크립트 훅은 어떻게 동작하나요?
foo라는 이름의 스크립트에 대해 npm은 자동으로 prefoo와 postfoo 스크립트를 찾아 foo 전후에 실행합니다. 예를 들어 package.json scripts에 prebuild, build, postbuild를 정의하면 npm run build를 실행할 때 세 개 모두 순서대로 실행됩니다. 빌드 전에 빌드 출력을 정리하거나(prebuild: "rimraf dist") 빌드 완료 후 후처리나 알림에 유용합니다. 라이프사이클 훅은 내장 npm start와 npm test 명령어에서도 동작합니다.
프라이빗 레지스트리를 사용하도록 npm을 설정하는 방법은?
.npmrc에 registry를 설정합니다: registry=https://your-registry.example.com/. 프라이빗 레지스트리의 scoped 패키지에는 @scope:registry=https://your-registry.example.com/을 사용합니다. 민감하지 않은 설정은 프로젝트 수준 .npmrc(커밋)에, 인증 정보는 사용자 수준 ~/.npmrc에 설정할 수 있습니다. 인증 토큰은 .npmrc에 //your-registry.example.com/:_authToken=${NPM_TOKEN}을 추가하고 NPM_TOKEN을 환경 변수로 설정해 토큰이 하드코딩되지 않도록 하세요.