main-logo

package-lock.json 과연 제대로 알고 있을까?

package-lock.json의 쓰임에 대해 자세히 알아보자

profile
이희원
2022년 01월 19일 · 0 분 소요

들어가며

지난 프로젝트 작업을 하면서, package-lock.json 파일에 대한 개념이 부족해
간단한 오류를 두고 몇 시간을 헤매는 일이 있었습니다.
물론, 그 과정에서 저를 도와준 팀원분들의 소중한 시간마저도 빼앗게 되었죠(?)
잘 알고 있다고 생각했지만, 막상 누군가 묻는다면 제대로 설명하지 못했던 package-lock.json파일.
여러분도 혹시 ‘그냥 이렇게 써왔으니까’ 하며 그냥 쓰고 계시진 않으신가요?



먼저 package.json 파일에 대해 알아보자

프로젝트를 진행하면 대부분 혼자가 아닌, 여러 작업자가 함께 협업하여 작업하게 됩니다.
그 과정에서 여러 작업자들은 각자의 환경에서 각자의 방식으로 작업을 하게 되죠.
작업을 하면서 때때로 모듈을 설치하는 경우가 있는데,
이 모듈은 npm을 통해 설치가 가능합니다.
그런데 여기서 문제가 있습니다.
내가 작업하고 있는 프로젝트에서 ‘필요한 모듈’이 무엇인지 어떻게 알 수 있을까요?
내가 작업 중간에 투입이 된다거나, 혹은 다른 작업자가 특정 모듈을 설치했다 했을 때
그것이 무엇인지 어떻게 알 수 있을까요?

이렇게 어떤 모듈이 필요한지 정리해둔 문서를 package.json이라고 합니다.

package.json은 모듈 말고도 프로젝트 이름, 명렁어 등 다양한 정보를 담지만,
오늘 포스팅하고자 하는 package-lock.json과 가장 연관이 있는 ‘모듈’에 대한 설명을 위주로 해보겠습니다.

개발자를 양성하는 ‘코드스테이츠’라는 기업은 package.json에 대해 이렇게 설명했다고 해요.


전자제품을 보러 갔을 때 제품 카탈로그가 바로 package.json이라 생각할 수 있습니다. 카탈로그만 보면 어떤 제품이 있는지 파악할 수 있는 것처럼 package.json만 보면 어떤 모듈이 들어가 있는지를 알 수 있습니다.





package.json 살펴보기



"dependencies"는 해당 프로그램이 실행되기 위해 반드시 필요한 모듈 목록이 적혀있습니다.
캡쳐된 package.json 파일을 조금 더 살펴보자면 앞에 영어로 된 이름은 패키지 이름이 될 것이고,
뒤에 숫자는 버전을 의미하는데요. 앞에 ^ 표시가 있죠?
이 부분에 대해서 조금 더 알아보겠습니다.


간단하게 알아보는 package.json 용어


*dependencies: 해당 프로그램이 실행되기 위해 반드시 필요한 모듈 목록
*devDependencies: 해당 프로그램을 개발하는 환경에서 필요한 모듈 목록
*script: npm으로 실행할 수 있는 명령어





^(캐럿) 그리고 ~(틸트)

패키지 숫자 앞에 ~ 혹은 ^가 붙어있는데요,
틸트(~)는 마이너 버전을 갱신합니다.
ex) ~1.2.3은 1.2.3부터 1.3.0 미만까지를 포함합니다.
캐럿(^)은 정식 버전에서 마이너와 패치 버전을 변경합니다.
ex) ^1.2.3은 1.2.3부터 2.0.0 미만까지를 포함합니다.


프로젝트를 시작할 때(중간에 투입될 경우) 레파지토리를 로컬 환경에 불러오고,
npm install을 통해 이 프로젝트에 필요한 패키지들을 받아옵니다.
그런데 이 과정에서 위의 캐럿과 틸트로 인한 문제가 발생돼요.
‘내가 사용할 패키지의 버전은 1.2.3 버전이야!’라고 명확히 말해주는 게 아닌
‘나는 1.2.3버전 이상의 패키지를 사용 할거야’ 라는 방식으로 말해주기도 하고,
npm install시 서로 다른 node_modules을 생성할 수 있기 때문이죠.

캐럿과 틸트 같은 version range을 사용하기 때문에, 새로운 버전의 패키지가 배포된 이후 설치를 진행할 경우 최신 버전으로 설치될 수 있습니다.

 

그래서 우리는 package-lock.json을 알아야합니다.



사진은 package-lock.json 파일의 일부를 캡쳐한 것인데요,
사진에서 보면 알 수 있듯 package.json 파일이 접두사(^,~)를 사용한 것과 달리
package-lock.json 파일에서는 7.16.0등과 같이 정확한 버전명이 적혀 있죠?
덕분에 우리는 다양한 작업자와 협업을 하더라도 동일한 node_module 트리를 생성하여,
같은 환경에서 문제없이 작업이 가능한 것이죠.


package-lock.json파일은 node_modules구조나 package.json파일이 수정/생성 될 때 자동으로 생성됩니다.
package-lock.json파일이 프로젝트내에 존재한다면, npm install시 package-lock.json 기준으로 node_modules가 생성됩니다.
얼마나 중요한지 이제 아시겠죠?

 

마치며

저는 package/package-lock.json 파일을 왜 업데이트하는지, 정확한 이유를 모르고
‘그냥 다들 이렇게 하니까’하는 마음으로 작업을 했었습니다.
해서 지난 프로젝트를 진행할 때 package-lock.json 파일을 함께 업데이트하지 않아
작업이 꼬이는 현상이 발생되었던 거였어요.
간단한 내용이라 느껴질지라도, 왜 쓰이고 어떤 목적성을 가지는지 명확히 안다면
작업을 하는 과정에 큰 실수를 막을 수 있다고 생각합니다.
모든 작업이 협업으로 이루어지는 개발인 만큼 해당 포스팅이 도움이 되시길 바랍니다.
읽어주셔서 감사합니다!