본문 바로가기

Backend/Node.js

package-lock.json 이란?

이번 포스팅에선 npm 6 버전부터 보이기 시작한 것 같은 package-lock.json 파일이 무엇이고 어떤 역할을 하는지에 대해 공식 문서의 도움을 받으며 알아보도록 하겠습니다.

 

- npm

 

 

npm 은 Node Package Manager 의 줄임말로 현재 Node.js 의 기본 패키지 관리자 이기도 합니다.

nvm 을 사용해 node 버전을 바꾸면 위처럼 npm 버전도 맞춰서 변경되는 걸 볼 수 있습니다.

꽤 예전부터 npm 의 대항마처럼 사용되던 yarn 이나 근래 사용자가 늘고 있는 yarn-berry 등의 패키지 매니저도 있지만
아직은 npm 이 가장 널리 쓰이는 것 같습니다. 이 npm 을 사용하면서 우리는 package-lock.json 파일을 마주하게 됩니다.

 

- What is package-lock.json ?

 

 

package-lock.json 파일은 npm 으로 최초에 패키지를 설치하는 순간부터 생성됩니다.

위 사진에서처럼 처음 npm init 을 통해 프로젝트를 생성했을 땐 package.json 파일만 존재한 상태에서

axios 패키지를 설치한 이후 package-lock.json 파일이 생성된 걸 볼 수 있습니다.

 

npm 을 이용해서 node_modules 트리나 package.json 파일을 수정하게 되는 모든 작업에선 이 파일이 자동으로 생성됩니다.

이 파일은 이후 설치에서 중간의 의존성 업데이트에 상관없이 동일한 트리를 만들어낼 수 있도록 생성된 시점의 의존성 트리에 대한 정보를 담고 있습니다.

 

공식 문서에는 package-lock.json 파일이 아래와 같은 목적을 갖고 있다고 합니다.

 

  • 팀원간에 혹은 배포, CI 에서 동일한 의존성을 설치하도록 보장하는 의존성 트리를 갖고 있습니다.
  • 사용자가 node_modules 디렉토리를 커밋하지 않더라도 node_modules 를 이전 상태로 되돌릴 수 있습니다.
  • diff 를 통해 의존성 트리의 변경 사항에 대한 가시성을 높여줍니다.
  • 이미 설치된 패키지에 대해 반복되는 메타데이터 확인 스킵을 허용함으로써 npm 에 의한 패키지 설치 과정을 최적화합니다.
  • npm 7 버전 부터는 package-lock.json 파일 자체로 충분한 정보를 갖고 있어 package.json 파일을 추가로 읽어야 하는 필요성을 줄여주고, 따라서 성능이 크게 향상됩니다.

 

특히 첫 부분에 적힌 내용은, 실제 회사에서도 팀원과 협업 간 혹은 배포시에 꽤 자주 일어나는 이슈입니다.

대체로 package.json 에는 버전이 캐럿(^)으로 명시되어 있기 때문에 특정 패키지의 마이너 혹은 패치버전 업데이트가 있었다면

건드리지도 않은 패키지에서 설치 에러나 실행 에러가 발생하기도 합니다.

이런 이슈를 해결할 때 package-lock.json 파일이 유용하게 쓰이며, 특히나 배포 및 ci 환경에선 package-lock.json 파일을 기반으로 의존성을 설치하는 npm ci 커맨드를 사용하기도 합니다.

 

- Format

 

 

package-lock.json 파일의 포맷은 위처럼 생겼습니다.

name 과 version 은 package.json 에 있는 내용을 그대로 따라갑니다.

lockfileVersion 이라는게 있는데, 이전엔 1 이었다가 npm 버전이 올라가면서 2로 변경된 것 같습니다.

문서에 나와있는 lockfileVersion 에 대한 내용은 아래와 같습니다.

 

package-lock.json 파일을 생성할 때 부터 사용된 문서의 버전 번호로 1부터 시작하는 정수.

npm 7 버전에서부턴 파일 포맷이 크게 변경되어 node_modules 또는 npm registry 를 검색해야 하는 정보를 추적할 수 있게 변경되어, 7 버전에 의해 생성된 lock file 에서부턴 버전이 2로 표시됩니다.

npm 5버전과 6버전에선 lockfileVersion 을 1로 사용했으며, 7버전에선 2를 사용하고 lockfileVersion 1과 역호환됩니다.

lockfileVersion 3은 npm 7버전에서 사용되는데 호환성이 없습니다. 숨겨진 lockfile 에 사용되며 일부 조건만 풀리면 npm 의 이후 버전에서 사용될 수 있습니다.

 

packages 에는 패키지에 대한 실제 위치 정보를 매핑하는 객체들이 위치해있습니다.

루트 프로젝트는 일반적으로 "" 로 표시된 키와 함께 나열되고 다른 패키지들은 루트 폴더의 상대 경로로 나열됩니다.

각 패키지는 version, resolved, integrity 등의 필드를 통해 해당 패키지에 대한 정보를 갖고 있습니다.

 

- Conclusion

 

결국 package-lock.json 파일의 가장 중요한 부분은 이 글의 중간쯤에 다 나와있는데, 요약하자면 이 파일은 의존성 트리에 대한 정보를 갖고 있고 해당 프로젝트의 의존성 설치가 필요한 부분에서는 이 파일을 통해 동일한 의존성을 설치하도록 보장할 수 있다는 부분이 핵심입니다. 굳이 npm 의 package-lock.json 에만 해당되는 내용은 아니고 yarn 에서 yarn.lock 파일에서도 동일합니다. 반드시 pacakge-lock.json 혹은 yarn.lock 파일의 형상 관리를 통해 의존성 설치시 뜬금없는 이슈를 겪지 않도록 하면 되겠습니다.

'Backend > Node.js' 카테고리의 다른 글

Cluster Module in Node.JS  (0) 2022.04.09
SharedArrayBuffer & Atomics (SharedMemory)  (0) 2022.04.03
axios configs 정리  (0) 2021.04.18
[Node.js] Date 라이브러리 퍼포먼스 비교  (1) 2021.03.06
[Node.js] Date 라이브러리 비교  (0) 2021.02.27