Package.json, Package-lock.json

package.json

package.json 내에 기재되어 있는 것은 현재 사용하고 있는 모듈이나 라이브러리에 대한 정보가 적혀 있습니다.

 

Package.json 의 구조

 

  • name - 프로젝트의 이름을 정의합니다.
  • version - 프로젝트의 버전을 정의합니다.
  • description - 프로젝트에 대한 간단한 설명을 제공합니다.
  • main - 프로젝트의 주 진입점 파일을 정의합니다.
  • scripts - 프로젝트에서 사용할 수 있는 스크립트를 정의합닌다.
  • repository - 프로젝트의 Git 저장소 정보를 정의합니다.
  • keywords - 프로젝트와 관련된 키워드를 정의할 수 있습니다.
  • author - 프로젝트의 작성자 정보를 정의합니다.
  • license - 프로젝트의 라이선스를 정의합니다.
  • bugs - 프로젝트의 버그 보고서를 제출할 수 있는 URL 을 정의합니다.
  • homepage - 프로젝트의 홈페이지 URL 을 정의합니다.
  • dependencies - 프로젝트의 종속성을 정의합니다. 여기서는 "axios" 패키지를 사용하고 있다는 의미입니다.

package.json 을 사용하지 않을 경우

  1. 개발 시 사용하는 외부 모듈들을 관리하기 어려워 집니다.
  2. 각 패키지마다 고유한 버전이 있기 때문에 프로젝트가 사용하는 패키지의 버전을 기록해야 합니다.
  3. 새로운 프로젝트를 진행할 경우 필요한 모듈이 많다면 매번 다시 설치를 해야하는 번거로운 문제를 방지합니다.

결론

일단 프로젝트의 작업에 대한 기록을 남길 수 있고, 다른 사람이나 다른 기기에서 이 프로젝트를 가져올 때 어떤 라이브러리를 사용했고, npm install 명령어로 해당 프로젝트에 필요한 라이브러리를 한번에 가져올 수 있기 때문입니다.

 

Package-lock.json

npm 공식문서에서는 package.json 파일의 의존성에 대한 정확한 버전과 의존성 트리를 포함하고 있습니다. 라고 설명합니다.

의존성 트리
Node.js 프로젝트에서 사용되는 패키지들 간의 의존 관계를 시각적으로 표현한 구조입니다.
이 구조는 각 패키지가 다른 패키지에 의존하고 있는지,
그리고 의존하는 패키지들 간에 어떤 의존성 관계가 있는지를 보여줍니다.

 

하지만 공식문서에서 설명한 부분을 이해하기에는 힘든 부분이 있기 때문에 저만의 방식대로 설명해 보고자 합니다.

package.json , package-lock.json 두 파일은 도대체 뭐가 어떻게 다른것일까요??

 

Package-lock.json 을 사용하는 이유

package.json 에서는 버전정보를 저장할 때 version range 를 사용합니다.
ex) "express": "~4.16.1"

version range 란?
"내가 사용할 패키지의 버전은 4.16.1버전이야" 라고 말하는 대신
"나는 4.16.1 버전 이상, 그리고 4.17.0 미만의 패키지를 사용할거야" 라고 말하는 방식

 

협업을 하기 위해서는 우리는 같은 package.json 을 사용해서 각자의 컴퓨터에 같은 패키지들을 설치해서

같은 개발환경을 구성하게 됩니다. 하지만 협업을 하면 이러한 경우가 생길 수 있습니다.

🙎‍♂️ : "왜 내 컴퓨터에서는 작동이 되지 않지?"
👤 : "내 컴퓨터에는 잘 돌아가는데? "
4시간뒤..
🙎‍♂️ : "혹시 너 express 버전이 몇이야? 난 4.16.1 인데?"
👤 : "4.16.3..."
🙎‍♂️ : ".....그게 문제였네.."

 

이러한 경우가 발생하기 때문에 탄생한 것이 package-lock.json 입니다.

package-lock.json 파일을 살펴보면, package.json 에는 틸드(~) 로 명시되어 있는 모듈들이 package-lock.json 에서는

버전명이 정확히 명시되어 있습니다.

한마디로 개발자들에게 현재 쓰고 있는 라이브러리의 정확한 버전명을 제공해 줌으로써 협업을 하거나, 개발을 할 때 

어떤 버전의 라이브러리를 사용하고 개발하는지 한눈에 확인할 수 있습니다.

 

또한 이외에도 예를 들어 axios 라이브러리를 사용한다고 가정했을 때 package.json 에서는 axios 라이브러리를 사용한다고 나와있지만 package-lock.json 에서는 axios 라이브러리를 사용할때 필요한 패키지들 ( axios 라이브러리를 설치할때 자동적으로 설치되는 패키지들 )의 정보들도 포함되어 있습니다.

Package.json 에 정확한 버전을 명시하지 않는 이유

 

만약 package.json 에 패키지 버전명을 정확히 명시하게 된다면, 프로젝트에서 사용하고 있는 패키지의 중요한 버그 수정이 이루어질 때 마다 프로젝트의 package.json 에 적혀있는 버전도 수정을 해야 하기 때문입니다.

 

모든 크고 작은 패키지들의 릴리즈에 대해 항상 추적하고 수정해야 하는 엄청난 귀찮음과 수고스러움을 version range 로 명시함으로써, 이를 해결해주는 것이죠.

 

정리하자면,

package-lock.json 파일 안에는 프로젝트의 의존성 트리를 포함한 각 의존성의 정확한 버전, 버전 충돌 등의 정보가 포함되기 때문에 설치 당시 의존성을 재현하고, 다른 개발자와 공유할 때 일관성을 유지하는 데에 사용됩니다.

따라서 package-lock.json 파일을 Github 등 버전 관리 시스템에 유지하고 삭제하지 않는 것이 좋습니다.

 

애초에 package.json 파일에 정확한 버전명을 적어두면 되지 않을까?

package.json 파일에 정확한 패키지 버전명을 명시한다면,  프로젝트에서 사용하고 있는 패키지의 중요한 버그 수정이 이루어질 때마다 프로젝트의 package.json 파일에 적혀있는 버전도 수정을 해야 하는 번거로움이 생길 수 있습니다.

즉, 크고 작은 패키지들의 릴리즈에 대해 항상 추적하고 수정해야 하는 번거로움을 version range로 명시함으로써 이를 해결해 주는 것이라고 보면 됩니다.

 

 

 

'CS' 카테고리의 다른 글

Docker  (1) 2024.10.26
DNS 의 기초 상식  (0) 2024.08.19
운영체제 기본에 대해서  (0) 2024.06.28
Cookie vs Session vs JWT  (0) 2024.05.15
Virtual DOM 을 왜 쓰나요?  (0) 2024.05.11