[React] package.json vs package-lock.json

yongkini ·2022년 12월 5일
0

React

목록 보기
8/19

package.json vs package-lock.json

결론 : 둘은 뭐가 다를까?

: package.json은 해당 프로젝트에서 사용하는 모듈들의 버전 정보들을 담는 패키지 관련 메타 데이터라고 할 수 있는데, 여기서 버전 정보를 표시할 때 '~' 를 써서 해당 모듈이 특정 범위(range)에 포함된다는 식으로 표시한다. 즉, 명시적으로 ver 1.3.3 이런식으로 표시하는게 아니라 ~4.16.1" 이런식으로 표시한다는 것이다. 하지만 package-lock.json은 앞에서 말한 것처럼 명시적으로 버전을 표시한다(ver 1.3.3 형태로). 그래서 처음에 특정 레포를 다운받아서 npm install을 하게 되면 package.json을 참조하여 node_modules를 만들어내지만, 처음 npm install을 한 뒤에는 package-lock.json이 생기게되고, 그 다음부터는 package-lock.json을 사용하여 node_modules를 생성하게 된다. 이는 결론적으로 더 정확한 버전의 패키지를 내려받기 위한 것이라고 할 수 있다(앞서 말했듯이 package-lock.json이 더 정확히 버전을 명시해둔 파일이므로).
** 추가로 npm install 명령어를 통해 어떤 패키지를 다운받게 되면 package.json과 package-lock.json에 함께 정보가 갱신된다고 한다.

하지만 왜 ??

: 앞서 말했듯이 package-lock.json은 일종의 package.json을 보조해주는 도구와 같다. 하지만, 애초부터 명시적인 버전명을 package.json에 써준다면 굳이 package-lock.json을 참조할 필요가 없지 않나?라고 생각할 수 있다. 만약에 package-lock.json이 없다면 만약에 우리가 쓰는 패키지에 문제가 생겨서 버전을 업데이트 했을 경우에 직접 package.json 의 버전도 수정을 해줘야한다. 하지만 앞서 말한 version range 방식으로 버전을 명시해놓은 덕에(?) 모든 패키지들의 릴리즈를 항상 추적할 필요가 없음과 동시에 정확한 버전 정보는 package-lock.json에 있어서 정확한 참조를 할 수 있게 된다(하지만 version range를 넘어가는 릴리즈가 있다면 이는 직접 수정을 해줘야할듯?).

정리

: 본래 프로젝트에 관한 namem version 등의 정보와 설치돼야할 패키지들의 목록을 dependencies or devDependencies로 관리하고 있는 파일이 package.json 인데 여기서는 verseion range 방식으로 버전을 표시한다. 이 때 개발자들은 협업을 위해 같은 레포(깃 레포와 같은)에서 플젝을 다운받고 이와 관련된 패키지를 설치해서 사용을 하게 되는데(같은 package.json을 사용해 각자의 컴퓨터에 같은 패키지들을 설치해 같은 개발환경을 구성하게 된다). 하지만 이와 관련해서 몇 가지 이슈가 발생한다면 같은 package.json을 사용하여 npm install 을 진행하더라도 서로 다른 node_modules를 생성하는 경우가 생기게 된다. 이렇게 되면 같은 프로젝트를 진행하고 있는 A, B, C 개발자 각각이 다른 결과물 혹은 에러를 마주치게 되므로, 협업에 있어서 큰 문제가 될 수 있다. 이러한 상황을 방지하기 위해 package-lock.json이 있다. package-lock.json은 node_modules 구조나 package.json이 수정되고 생성될 때 당시의 의존성에 대한 정확하고 구체적인 정보를 품고 자동으로 생성된다. 또한, package-lock.json이 존재할 때는 npm install 을 할 때 package.json을 참조하는게 아니라 package-lock.json을 사용하여 node_modules를 생성하게 된다.

근데.. 이러면 또 드는 의문이 그러면 애초에 package.json을 왜 만들까? =>

잠시 시맨틱 버저닝 규칙

시맨틱 버저닝 규칙(Semantic Version Rules, SemVer)은 패키지의 버전명을 숫자로 관리하는 방법으로 많이 사용되고 있습니다. 버저닝 규칙은 다음과 같습니다.
** [Major].[Minor].[Patch]-[label]
Major, Minor, Patch는 각각 숫자를 사용합니다. 예를 들어 1.2.3-beta 와 같이 표기합니다.
Major: 이전 버전과 호환이 불가능할 때 숫자를 하나 증가시킵니다. Major 버전이 바뀐 패키지를 사용하고자 한다면 반드시 breaking change(하위 호환성이 깨진 기능) 목록을 확인하고 이전 기능을 사용하는 코드를 수정해야 합니다.
Minor: 기능이 추가되는 경우 숫자를 증가시킵니다. 기능이 추가되었다고 해서 이전 버전의 하위 호환성을 깨뜨리지는 않습니다.
Patch: 버그 수정 패치를 적용할 때 사용합니다.
label(선택사항): pre, alpha, beta와 같이 버전에 대해 부가 설명을 붙이고자 할 때 문자열로 작성합니다.

위와 같이 버전 정보를 표시할 때 세부적으로 bug fix 정보 등도 포함되게 되는데, pacakge.json에 앞서 말한대로 명시적인 버전정보를 적게 되면 해당 패키지가 버그 픽스로 버전 정보가 바꼈는지 등을 계속해서 추적하며 바꿔줘야하는 번거로움이 있기 때문이다.

하지만 정말 최종적으로 해결되지 않는 의문은(내가 잘 이해를 못한걸수도 있지만!) package.json이 프로젝트와 연관된 개략적인 정보를 담는 파일이라고 했을 때 굳이 이런 개략적인 정보가 필요한 이유는 뭘까? 이다. 위에서 언급했듯이 결국 package-lock.json이 생긴 이후에는 이걸 참조해서 node_modules를 변경 or 설치하는데 그렇다면 결국 package-lock.json이 설치에 핵심이 되는 파일이라는 소리인데.. package.json에도 계속해서 정보 갱신을 하고 파일을 유지하는 이유가 있는걸까?. 개략적인 정보 확인용도??.. (이건 후에 알게되면 수정할 예정!).

profile
완벽함 보다는 최선의 결과를 위해 끊임없이 노력하는 개발자

0개의 댓글