package.json과, 이를 생성하는 npm install 명령어 🖥 (+ package-lock.json)

김예지·2022년 3월 3일
4

공부 흔적 📚

목록 보기
3/5

지금까지는 package.json 파일은 그저 패키지를 npm install을 통해 설치하면 생기는 파일정도로 생각했는데, 정확히 package.json 파일이 왜 있는지에 대해서 알지 못했다. (그냥 개발하면 있는 파일 정도로 생각한...😅)
그래서 이번에는 package.json의 역할에 대해서 공부해봤다.

package.json의 역할


package.json 파일은 프로젝트의 정보(1)를 정의하고, 의존하는 패키지 버전 정보(2)를 명시하는 파일이다. 일반적으로 루트에 위치하게 된다.
package.json에 작성되는 정보를 정리하면 다음과 같다.

1. 프로젝트에 대한 정보

package.json은 현재 개발중인 프로젝트에 대한 정보를 알려주는 역할을 한다. 프로젝트에 대한 정보를 알려줄 수 있는 다양한 영역이 있지만 반드시 포함되어야하는 정보는 name, version 영역이다.

  • name: 프로젝트의 이름, 소문자 한단어 (-과 _를 허용한다)
  • version: 프로젝트의 버전, x.x.x 형식

2. 패키지의 버전 정보

package.json 파일은 설치한 패키지의 버전 정보를 포함한다. 이때 설치된 패키지를 dependencies, devDependencies로 나눠 관리한다.
이렇게dependenciesdevDependencies를 구분해서 패키지를 설치를 해야 빌드시간도 줄이고, 배포할 때 불필요한 라이브러리를 포함시키지 않아도 된다.

  • dependencies: 일반적으로 의존하고 있는 패키지들의 버전 정보으로, 애플리케이션 동작과 관련되어서 반드시 있어야하는 것이다. 즉, 배포를 할때도 포함해야한다.
    설치는 npm install <package_name> 을 통해 dependencies로 설치할 수 있다.

  • devDependencies: 개발 모드일 때만 의존하고 있는 패키지들의 버전 정보이다. 즉, 애플리케이션 동작과 직접적 연관은 없으나 개발할 때만 필요한 라이브러리이기 때문에 배포할 때 포함하지 않는다.
    설치는 npm install <package_name> --save-dev or npm install <package_name> -D (npm i -D <package_name>)를 통해 devDependencies로 설치할 수 있다.

여기서 패키지와 모듈의 다른점은?

  • 패키지: 패키지는 package.json 으로 설명되는 파일. 패키지는 반드시 package.json을 가지고 있어야한다.패키지를 지정하기 위해서는 package.json의 ‘dependencies’ 또는, ‘devDependencies’에 패키지를 명시해야한다.
  • 모듈: 모듈은 애플리케이션을 구성하는 개별적 요소이다. node_modules 디렉토리 안의 파일 또는 디렉토리이다. 모든 모듈이 패키지가 아니다. 모듈 중 package.json을 가진 모듈만이 패키지이다. 즉, 모듈이 패키지보다 큰 개념이다

npm install


npm(node package manager)은 자바스크립트에서 패키지를 관리하는 매니저이다. npm은 명령 프롬프트에 입력하는 명령어이며, 다양한 npm 명령어를 통해 Node.js에서 사용할 수 있는 패키지들을 설치 및 관리할 수 있다.

그렇다면, package.json을 생성하는 npm install 명령어는 무엇일까? npm install을 통해 패키지를 설치 하면 package.json 파일이 생기는데, npm install의 동작은 둘로 나눌 수 있다.

1. 패키지명을 명시해서 특정 패키지 설치하는 동작

예를들어,$ npm install <package-name>를 통해 패키지의 이름을 명시하여 특정 패키지를 설치하는 동작이다.

2. 패키지명을 명시하지 않고 package.json 파일의 의존성을 설치하는 동작

$npm install 을 통해 package.json에 포함된 ‘모든' 의존성 패키지들이 일괄적으로 설치할 수 있다.
여기서, devDependencies같은 파일은 개발에만 사용되기 때문에, 일반 사용자들이 이 패키지를 내려받는 것은 낭비이다.
따라서, -production플래그를 붙혀서 devDependencies를 제외한 dependencies 파일만을 내려받을 수도 있다.

package-lock.json의 역할


package-lock.json 파일의 존재 이유는, 위에서 살펴본 package.json에 패키지 버전에 대한 정보가 부족하기 때문이다.
package.json에서는 패키지의 버전 명시가 version range의 형태로 작성된다. 즉, 패키지 버전을 명확하게 지정하기보다는 버전의 범위를 명시한다.
패키지 버전을 정확히 명시하지 않고, 왜 범위로 명시하는 것일까? 이유는, 만약 그 패키지에 버그가 발생되어서 수정이 이뤄질 때마다 package.json에 적혀있는 버전도 일일이 수정해야하는 번거로움이 생기기 때문이다.

하지만, 협업을 한다고 생각해보자. 협업을 하게되면, package.json에 있는 패키지를 설치하여 모두 같은 개발환경을 구성하게 된다. 하지만, package.json을 사용해서 npm install을 진행하면 서로 다른 node_modules를 생성하는 경우가 생길 수 있다.
이는 package.json에 명확한 패키지의 버전이 명시되어있는 것이 아니라 범위로 명시되어있기 때문에 서로 다른 버전의 패키지가 설치될 수 있는 것이다.
이렇게 되면 협업을 하는데 모두 다른 버전의 패키지를 설치하게 될 수 있으며, A에게는 잘 돌아가는 테스트가 B에게는 돌아가지 않을 수 있다.

이런 문제를 해결하기 위해서 package-lock.json이 필요한 것이다!
package-lock.json은 package.json과 달리 명확한 버전정보가 명시되어있다.


위 사진은 package.json파일에 명시된 gh-pages 패키지에 대한 버전정보이고, 아래 사진는 package-lock.json파일에 명시된 gh-pages 패키지의 버전정보이다. package.json에는 버전이 범위로 명시되어있고, package-lock.json에는 버전이 콕!찝어서 명확하게 명시되어있다.
그래서 협업을 할때에는 package-lock.json을 기준으로 패키지를 설치하게 된다. package-lock.json 파일이 존재할 때는 npm install을 했을 때 package.json을 기준으로 node_modules를 생성하지 않고 package-lock.json을 사용하여 node_modules를 생성한다.

따라서, package-lock.json은 개발자들이 동일한 node_modules를 생성할 수 있도록 만들어 주는 것이다. 즉, 협업할 때 꼭 필요한 파일! 배포할때도 package.json과 package-lock.json 파일을 꼭 꼭 함께 커밋해야한다.

마무리


개발 공부한지 그래도 반년이 넘었는데, 한번도 package.json, npm install의 존재에 대해서 알아볼 생각을 안했다는 사실이 새삼 충격이다 👀
조금 늦긴 했지만, 이제라도 여기에 대해서 공부할 수 있어서 좋았다. 아는만큼 보인다고, 개발하면서 package.json이 생각보다 다양한 정보를 포함하고 있음을 깨닫고있다.

지금까지 개발 공부를 정말 얕게 대충 공부했구나, 반성했다. 앞으로는 조금 더 집요하게 공부해야지...!🔥


📚 참고

profile
내가 짱이다 😎 매일 조금씩 성장하기🌱

2개의 댓글

comment-user-thumbnail
2022년 3월 4일

위니 잘 읽었습니다! package.json 에 대해서 공부해 볼 마음은 어떻게 드셨는지 신기하네요.. 추가적으로 package.json과 package-lock.json의 차이에 대해서도 알아보시는건 어떨까요? 친구 면접 질문이었다는데👀

1개의 답글