Package.json과 Package-lock.json의 차이를 아시나요?

송유현·2021년 7월 11일
80
post-thumbnail

Velog는 항상 보기만 했지, 글을 써보는 건 처음입니다. 글솜씨가 많이 서툴더라도 귀엽게 봐주세요..
틀린 내용이 있다면 피드백이나 지적해주시면 정말 너무 감사하겠습니다.😁

npm을 사용하면서 정말 지겹게도 많이 봤던 package.jsonpackage-lock.json...
두 파일들을 어떤 모듈이 어떤 버전으로 깔렸는지 명시되어있는 일종의 표..? 정도로만 생각했던 저는 의문이 안 들 수가 없었습니다.

두 파일은 도대체 뭐가 어떻게 다른걸까???

그래서 이 글을 통해서 package-lock.json이라는 파일들에 대해서 좀 더 자세히 알아보려고 합니다.
본 글에서는 package.json이 어떤 파일인지는 다루지 않았습니다. 이 점 주의바랍니다.

🤔 Why??

모든 파일에는 파일마다의 역할이 있습니다.
당연하게도 package.json 파일이 제 역할을 다 한다면, package-lock.json은 만들어질 이유가 없습니다.

그렇다면 이 package-lock.json은 왜 만들어질까?

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

version range란❓
🙋🏻‍♂️ : "내가 사용할 패키지의 버전은 4.16.1버전이야" 라고 말하는 대신
🙋🏻‍♂️ : "나는 4.16.1버전 이상, 그리고 4.17.0 미만의 패키지를 사용할거야" 라고 말하는 방식을 뜻해요.
물론 전자처럼 버전정보를 명시하는 것도 가능합니다.

협업을 하기위해 우리는 같은 package.json을 사용해서 각자의 컴퓨터에 같은 패키지들을 설치해서 같은 개발환경을 구성하게 됩니다.

하지만 불행하게 이러한 일들이 일어날 수 있습니다.

👨🏻‍💻 : "코드가 돌아가질 않네...뭐가 문제지..."
👩🏻‍💻 : "내 컴퓨터에서는 잘만 돌아가는데..?"
👨🏻‍💻 : "하... 뭐가 문제지...."
몇 시간 뒤....
👨🏻‍💻 : "모듈에 문제가 있는 거 같아.. 나는 4.16.1 인데, 너는 버전 몇이야?"
👩🏻‍💻 : "4.16.2"
👨🏻‍💻 :

시간은 금인데 이런 하찮은 버전 문제때문에 몇 시간씩 버리다니...
물론 위와 같은 상황도 해결할 수는 있습니다.

1. 팀원끼리 사전에 npm --version 명령어를 통해 npm 버전이 일치하는지 확인
2. 이미 잘 못 깔아버린 node modules 삭제
3. npm cache 삭제
4. npm install 명령어로 다시 dependencies를 설치

음...꽤나 길지 않나요...?
개발자들은 항상 모든 일에 효율을 극한으로 따집니다.
이렇게 귀찮은 행동들을 개발자들이 그냥 넘어갈 리가 없죠.

그래서 태어난 것이 바로 이 package-lock.json입니다.

package-lock.json파일을 살펴보시면, package.json에는 틸드(~)로 명시되어있는 모듈들이 package-lock.json에는 버전명이 정확히 명시되어 있습니다.

정확한 버전의 패키지를 다운받기 위함같네요.

🤨 When??

이렇게 package-lock.json 생겨났는지는 알게되었습니다.
하지만 아직 의문점이 남아있는데요.

그렇다면 이 package-lock.json은 언제 만들어질까?

npm 공식문서에 따르면, package-lock.json은 npm이 node_modules트리 또는 package.json이 수정될 때, 자동으로 생성이 된다고 나와있습니다.

한 마디로 npm install로 어떠한 모듈을 install하였을 때, package.json과 함께 생성된다고 보면 되겠네요.

But...??

하지만 여기서 주목해야할 점은 이게 아닙니다.
바로 package-lock.json이 존재할 때에는 npm install의 동작방식이 조금 변한다는 점입니다.

package.json을 사용하여 node_modules를 생성하지않고 package-lock.json을 사용하여 node_modules를 생성합니다.

더 정확한 버전의 패키지를 내려받기 위함 같네요.

🤷‍♂️ Then??

그래서 하고 싶은 말이 뭐냐면...

package-lock.jsonpackage.json으로는 부족한 정보를 도와주는 파일이다.
따라서 생성된 package-lock.json파일은 소스 저장소에 꼭 커밋을 하자!

이건데... 여기서 제 궁금증은 모두 해결되지 않았습니다.

애초에 package.json에 정확한 버전명을 적어놓으면 안되는거야?

너무 맞는 말이죠. package.json에 정확한 버전명을 명시해두면, 패키지도 정확히 다운받아질텐데... 뭐가 문제지?

💭 TMI...

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

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

출처

package-lock.json 파일에 대해서 알아보면서, 이렇게나 많은 글들이 있을 줄은 몰랐습니다.
제 글에 도움을 주셔서 감사합니다.🙇🏻‍♂️

이상으로 포스팅을 마칩니다. 긴 글 읽어주셔서 감사하고,
다시 한번 말씀드리지만, 피드백은 언제나 환영입니다.😚

profile
나를 위한 글보다는 남을 위한 글을 쓰려고 노력합니다.

14개의 댓글

comment-user-thumbnail
2021년 7월 14일

궁금해하면서도 직접 찾아보지는 않던 사실이네요... 잘 배워갑니다!

1개의 답글
comment-user-thumbnail
2021년 7월 17일

글 재밌어요👍

1개의 답글
comment-user-thumbnail
2021년 7월 18일

좋은 글 잘 보고 갑니다!

1개의 답글
comment-user-thumbnail
2021년 7월 20일

좋은 내용 감사합니다. 필력이 좋으셔서 글이 잘 읽히네요 :)

1개의 답글
comment-user-thumbnail
2021년 7월 24일

좋은 정보를 재밌게 잘 풀어쓰시네요!

1개의 답글
comment-user-thumbnail
2021년 9월 1일

질문있습니다!
package.json에 정확한 버전명을 적지 않는 이유가 버그 수정에 따른 버전 수정 문제라고 하셨는데, 어짜피 package-lock.json도 같은 상황에서 수정해야하지 않나요??? 왜 저 방식이 더 효율적인지 이해가 안가요ㅠ

1개의 답글
comment-user-thumbnail
2022년 8월 8일

간지나요

답글 달기
comment-user-thumbnail
2023년 12월 6일

찾고있는 유익한 정보였네요 잘읽고갑니다

답글 달기