package-lock.json과 npm 버전 범위로 의존성을 재현 가능하게 고정하는 법
package.json에는 프로젝트가 허용하는 의존성 범위를 선언하고, 생성된 package-lock.json은 실제 해결된 버전과 트리 정보를 함께 커밋하세요. CI에서는 잠금 파일과 package.json이 맞는지 검사하는 npm ci를 사용하고, 버전 변경은 별도 업데이트 작업으로 잠금 파일 diff를 검토해야 합니다.
캐럿이나 틸드를 모두 정확한 버전으로 바꾼다고 해서 전이 의존성까지 같은 트리가 되는 것은 아닙니다. 직접 의존성의 정책과 실제 설치 결과를 각각 담당하는 두 파일을 함께 관리해야 다른 환경의 차이를 줄일 수 있습니다.
먼저 보는 핵심 요약
- package.json의 SemVer 범위는 설치 가능한 버전 집합을 표현하며 애플리케이션의 업데이트 정책을 담습니다.
- package-lock.json은 npm이 해결한 의존성 트리와 무결성 등 설치 재현에 필요한 정보를 기록합니다.
- npm ci는 잠금 파일을 임의로 갱신하지 않고 선언과 맞지 않으면 실패하므로 CI의 불일치를 빨리 찾는 데 유용합니다.
버전 범위와 잠금 파일이 맡는 역할
package.json의 dependency 값은 허용할 릴리스 범위를 사람과 도구에 알립니다. package-lock.json은 특정 설치에서 선택한 직접·전이 의존성과 해석 정보를 기록합니다. 범위만 남기고 잠금 파일을 공유하지 않으면 설치 시점에 따라 범위 안의 다른 버전이 선택될 수 있습니다.
npm install과 npm ci를 구분하는 이유
npm install은 의존성을 추가하거나 범위 안에서 해결하면서 잠금 파일을 갱신할 수 있습니다. npm ci는 기존 잠금 상태를 기준으로 깨끗한 설치를 수행하며 package.json과 맞지 않으면 오류를 냅니다. 개발 중 변경과 CI 검증의 명령을 구분하면 의도하지 않은 lockfile 수정이 줄어듭니다.
잠금 파일 diff에서 확인할 항목
직접 올린 패키지 외에 함께 바뀐 전이 의존성, resolved 출처, integrity, 설치 스크립트가 있는 패키지를 살펴봅니다. npm 버전 차이로 lockfileVersion이나 표현이 크게 바뀔 수 있으므로 팀과 CI의 Node·npm 버전을 함께 고정하고 도구 변경은 별도 커밋으로 분리하는 편이 검토하기 쉽습니다.
재현 가능성과 완전 동일을 구분해야 하는 경우
잠금 파일은 의존성 해결 차이를 크게 줄이지만 운영체제·CPU별 선택 의존성, 네이티브 빌드, 설치 스크립트, 런타임 버전까지 모두 같게 만드는 파일은 아닙니다. 배포 이미지는 Node와 npm 버전, 환경 변수, 빌드 명령도 함께 기록하고 산출물을 테스트해야 합니다.
단계별로 확인하는 방법
- 버전 정책 정하기
직접 의존성마다 자동으로 허용할 변경 범위를 정하고 package.json 표현을 검토합니다.
- 잠금 파일 함께 커밋하기
팀에서 합의한 npm 버전으로 설치해 package-lock.json을 만들고 package.json과 한 변경으로 검토합니다.
- CI를 npm ci로 검증하기
깨끗한 환경에서 npm ci를 실행해 선언 불일치와 누락된 잠금 파일 변경을 실패로 드러냅니다.
- 업데이트를 별도 반영하기
정기 업데이트에서 테스트와 보안 검토를 수행하고 의도한 lockfile diff만 병합합니다.
판단 기준을 한눈에 비교하기
| 확인 항목 | 판단 기준 |
|---|---|
| package.json | 직접 의존성 요구 범위, 스크립트와 프로젝트 메타데이터를 선언합니다. |
| package-lock.json | npm이 실제로 해결한 의존성 트리와 무결성 정보를 기록합니다. |
| npm install | 의존성 추가·변경과 잠금 파일 갱신이 필요한 개발 작업에 사용합니다. |
| npm ci | 기존 잠금 상태를 수정하지 않는 깨끗한 설치와 CI 검증에 사용합니다. |
실행 전 체크리스트
- package.json과 package-lock.json을 함께 커밋했나요?
- 팀과 CI의 Node·npm 버전을 명시했나요?
- 예상하지 못한 전이 의존성 변경을 검토했나요?
- 깨끗한 환경의 npm ci와 테스트가 통과했나요?
주의할 점
버전을 잠갔다고 해당 패키지가 안전하거나 모든 운영체제에서 동일하게 빌드된다는 뜻은 아닙니다. 보안 업데이트를 정기적으로 검토하고, 네이티브 의존성과 설치 스크립트가 있는 프로젝트는 대상 배포 환경에서 별도로 검증하세요.
함께 보면 좋은 글
자주 묻는 질문
애플리케이션에서 package-lock.json을 커밋해야 하나요?
npm 공식 문서는 잠금 파일을 소스 저장소에 커밋해 팀원, 배포, CI가 같은 의존성 트리를 설치할 수 있게 사용할 것을 설명합니다.
package.json을 모두 정확한 버전으로 쓰면 lockfile이 필요 없나요?
전이 의존성과 실제 해석 트리는 직접 의존성 버전만으로 완전히 고정되지 않으므로 잠금 파일의 역할이 남습니다.
npm ci가 package-lock.json을 자동으로 고쳐 주나요?
아닙니다. 선언과 잠금 파일이 맞지 않으면 실패하며 설치 과정에서 package.json이나 잠금 파일을 수정하지 않습니다.
lockfileVersion이 바뀐 diff를 그대로 병합해도 되나요?
사용한 npm 버전 변경이 원인인지 확인하고 팀·CI 호환성을 검증하세요. 의존성 업데이트와 도구 형식 변경을 분리하면 검토가 쉬워집니다.
근거와 출처
- npm package-lock.json 공식 문서 — 1차 출처, 조회일 2026-08-30
- npm package.json 공식 문서 — 1차 출처, 조회일 2026-08-30
도구에서 직접 확인하기
설명한 기준을 실제 값에 적용하려면 SemVer 범위 검사기에서 작은 샘플부터 확인하세요. 원본과 결과를 나란히 비교한 뒤 실제 사용 환경에 적용하는 순서가 가장 안전합니다.
이 글은 알파카랩스 Utils의 개발 도구 도구와 함께 보는 정보성 가이드입니다. 규격과 외부 서비스 정책은 바뀔 수 있으므로 중요한 결정 전에는 연결된 공식 출처의 최신 내용을 다시 확인하세요.