반응형
Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

오늘부터 공부한다

2. [Nodejs] package.json과 package-lock.json은 무엇일까? 본문

NodeJs

2. [Nodejs] package.json과 package-lock.json은 무엇일까?

1000hg 2021. 7. 22. 13:11
반응형

 

 

Nodejs를 사용할 때 자주 볼 수 있는 파일이 있습니다.

package.json과 package-lock.json입니다.

 

 

자주 보고, 자주 건드려 보지만 둘의 차이와 사용 목적을 잘 모르는 경우가 있습니다.

이번 포스팅에서는 둘의 차이점과 사용 목적, 사용 방법 등을 작성하겠습니다.

 

 

Nodejs을 조금 사용하신 분들은 npm init과 npm install package.json을 통해 작성된 패키지 모듈을 설치해

본 경험이 있을 것입니다. 그게 아니라면 scripts 부분의 빌드 부분을 만져보셨을 겁니다.

supervisor 또는 nodemon 등등.. 빌드와 실행 구문을 수정해본 경험이 없으신가요?

 

없더라도 여기서 알아가면 됩니다. ^^

 

 

1. package.json 이란?

 

가장 먼저, package.json이 무엇이냐 하면.

현재 프로젝트에 대한 정보를 저장하는 곳입니다.

 

이는 프로젝트의 루트 디렉토리에 저장하며 애플리케이션 종속성 및 기타 정보를 저장합니다.

(express나 koa에서 package.json은 항상 app.js와 같은 root 디렉토리에서 발견할 수 있습니다)

위의 예시는 아래 사진에서 확인할 수 있습니다.

 

이전 포스팅에서 작성한 passport.js의 파일 구조

 

 

2. Package.json의 구조

 

package.json의 파일 내의 각 정보는 기본적으로 key-value로 저장되는 단일 JSON 객체입니다.

JSON을 작성하는 것으로 반드시 모든 key는 쌍따옴표("")로 감싸줘야만 하며

쉼표(,) 기호로 구분을 해줘야합니다.

 

필수적으로 해당 프로젝트에 관한 name과 version 속성이 명시되어야 하고,

설치되어야 할 패키지들의 목록을 dependencies 또는 devDependencies 속성에 명시할 수 있습니다.

 

passport.js의 package.json

dependencies와 devDependencies 속성의 차이를 보자면, 

 

dependencies와 달리 devDependencies의 패키지들은 배포시 굳이 설치가 필요없는, 개발 환경에서만

사용하는 패키지들을 추가하는 곳입니다.

 

예) css-loader, style-loader, Mocha, Jest, webpack, babel 등등

(물론 배포 상황에 따라 다르겠지만, 저는 위의 내용들을 주로 넣었습니다.)

 

조금 더 자세하게 설명하자면,

 

"dependencies" 속성에는 --save 옵션으로 "npm install {패키지명}" 명령어를 실행할 때 설치되는 Node.js 패키지가 등록되고, "devDependencies" 속성에는 --save-dev 옵션으로 "npm install {패키지명}" 명령어를 실행할 때 설치되는 Node.js 패키지가 등록됩니다.

 

이 둘을 제외하더라도 packages.json에는 poordependencies 이나 keywords, config, bug, license 등 다양한

정보들이 저장되지만 생략하도록 하겠습니다. 더 자세하게 알아보고 싶은 분들은 따로 구글링 부탁드립니다.

 

3. package-lock.json

package.json에 tmi가 너무 많았나요?

이제 본 포스팅의 메인 내용인 package-lock.json에 대해 알아보겠습니다.

 

package-lock.json을 사용하는 이유가 무엇일까요?

 

그것은 우리가 기존에 사용하는 package.json의 정보가 부족하기 때문입니다.

package.json에서 버전을 지정할때는 version range(~0.0.1)의 형태를 사용합니다

 

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

같은 개발환경을 구성하게 됩니다. 하지만 몇 가지 이슈가 발생한다면 같은 package.json을 사용하여

npm install을 진행하더라도 서로 다른 node_modules를 생성하는 경우가 발생합니다.

 

1. npm 버전이 다른 경우

2. 버전을 명시하지 않고 version range를 사용하여, 새로운 버전의 패키지가 배포된 이후 설치를 진행할 경우

3. 내가 사용하는 패키지를 의존하고 있는 패키지가 새로운 버전으로 배포되었을 경우

 

첫 번째의 경우 npm --version으로 버전을 확인한 이후 npm 버전을 일치시키면 예방할 수 있습니다.

 

하지만 개발하는 두 사람의 range-parser이 달라 실행되지 않으면 어떨까요?

개발한 사람의 반대쪽 사람은 테스트를 계속 실패해서 난감한 상황이겠죠;;

 

이런 블행한 상황을 피하기 위해 태어난 것이 package-lock.json입니다.

 

passport.js의 package.json
passport.js의 package-lock.json

 

위의 사진을 본다면

package.json에는 "~4.16.1" 으로 적혀있지만, package-lock.json에는 "4.16.4"라고 버전명이 명확하게

적혀있습니다.

 

package-lock.json은 node_modules 구조나 package.json이 수정되고 생성될 때 당시의 의존성에 대한 정확하고

구체적인 정보를 품고 자동으로 생성됩니다.

 

또한 package-lock.json 이 존재할 때에는 npm install 의 동작방식이 조금 변하는데요.

package.json 을 사용하여 node_modules를 바로 생성하지않고 package-lock.json 을 사용하여 node-modules 

생성합니다.

 

 

4. 마무리 및 정리

이제 package-lock.json을 사용하는 목적과 차이점을 알게되었습니다.

 

결론은 협업을 할 때 서로의 버전을 맞추기 위한 기능으로 version range 형태로 작성된 package.json을 명확하게 지정하여 테스트 기능들을 사용할 수 있도록 도와주는 파일입니다.

 

여기서 의문점이 생기는데, package.json에 version range를 주지 않고 명확하게 주면 되지 않을까?

 

만약 package.json 에 패키지 버전을 명확하게 지정 정해놓는다면,

프로젝트에서 사용하고 있는 패키지의 중요한 버그 수정이 이루어질 때 마다 프로젝트의 package.json 에 적혀있는 버전도 수정해 주어야하기 때문입니다.

 

끝 ^^7

 

반응형

'NodeJs' 카테고리의 다른 글

3. [Nodejs] v8엔진이란?  (1) 2021.08.10
1. [Nodejs] Passport.js 사용하기  (2) 2021.07.15