잡다한 교훈

[npm] package-lock.json

콘요맘떼 2022. 3. 9. 22:06

  예전부터 궁금했던 문제이다. package.json과 package-lock.json은 어떤 차이가 있을까? 궁금하면 별 다를 수 있나. 공부해야지.

 

package.json

  package.json은 프로젝트의 정보(name, version 등) 혹은 의존 패키지 정보(dependencies, devDependencies)를 저장한다. (참고로 그냥 dependencies는 프로덕션을 위해 필요한 패키지들을, devDependencies는 로컬 개발 혹은 테스팅과 관련된 패키지들을 다룬다.) package.json의 주요 특징은 버전 정보를 저장할 때 구체적인 버전이 아니라 version range를 기록한다는 것이다. 즉 버전 o.o.o을 사용한다가 아니라 버전이 o.o.o 이상이다, o.o.o 미만이다 등의 정보로 패키지 의존성을 표현하는 것이다. 그렇기 때문에 동일한 package.json으로 npm install을 수행해도 서로 다른 버전의 패키지들이 발생하는 경우도 존재할 수 있다. (만약 서로 다른 노드 트리 모듈의 프로그램들이 동일하게 동작하면 문제가 되지 않겠지만 서로 다르게 동작할 가능성도 존재하기에 문제가 된다.)

 

 

package-lock.json

  package-lock.json은 구체적인 패키지 버전 정보를 기록해준다. 그렇기 때문에 모든 환경에서 동일한 노트 모듈 트리를 가지고 개발을 진행할 수 있다. 만약 package.json과 package-lock.json 두 파일 모두 존재한다면 npm은 후자를 기준으로 설치를 진행한다.

 

 

그럼 version range는 왜 필요한가?

  그렇다면 왜 package.json에서 구체적인 버전 정보를 저장해서 하나의 파일로 관리하지 않는가에 대해 의문이 생길 수 있다. 그러나 구체적인 버전 정보만을 기록하게 되면 패키지의 주요 변경점이 발생할 때마다 패키지 버전을 tracking하고 수정해야 하는 문제가 발생한다. version range로 버전을 표현하면 이러한 문제를 해결해줄 수 있다. 결국 두 가지 방법 모두를 활용하여 패키지 정보를 기록하는 데는 나름의 이유가 있었다.