npm(node package manager)은 노드 패키지(modules)를 관리하기 위한 매니저 시스템으로 다양한 패키지들을 설치, 업데이트, 삭제하는데 도움을 주는 툴이라고 생각할 수 있다.
노드의 정의는 크게 두가지로 나눌 수 있다.
서버: 네트워크를 통해 클라이언트에 정보나 서비스를 제공하는 컴퓨터 또는 프로그램
자바스크립트 런타임: 자바스크립트 프로그램을 컴퓨터에서 실행할 수 있게 해주는 환경
npm에서의 노드는 자바스크립트 런타임을 뜻하고, 대부분의 자바스크립트 프로그램은 패키지라는 이름으로 npm안에 등록되어 필요로하는 패키지가 있다면 npm에서 찾아 설치할 수 있다. npm에 업로드된 노드 모듈을 패키지라고 부른다. 그래서 npm을 자바스크립트 패키지 매니저라고도 부른다.
package.json은 생성한 프로젝트의 메타정보와 프로젝트가 의존하고 있는 모듈들에 대한 정보들을 json 형태로 모아놓은 파일이다.
package.json 파일을 사용하지 않을 경우 여러 문제가 발생할 수 있는데,
프로젝트에서 사용하는 외부 모듈들이 많아지게 되면 관리하기 어려워짐
패키지들의 버전관리가 어려워짐
새로운 프로젝트를 진행할 경우, 필요한 모듈들이 많다면 매번 npm 명령으로 설치해야하는 번거로움이 존재
package.json은 필요한 패키지들의 목록을 파일로 정리해놓고, 목록 파일을 이용하여 단 한번의 명령어로 필요한 패키지들을 모두 설치 할 수 있다. 즉 package.json은 프로젝트에 대한 메타정보, 그리고 설치한 패키지의 의존성 및 버전을 관리하는 파일이다.
팀 내에서 동일한 개발환경을 구축하려고 할 경우, package.json을 통해 동일한 개발환경을 빠르게 구축할 수 있다.
$ npm init
이런 명렁어를 통해 package.json의 초기 파일을 생성 할 수 있다. 이외에도 React나 Vue 프로젝트를 생성하게 되면 package.json은 자동으로 생성된다.
npm을 통해 프로젝트를 생성하게 되면, node_modules라는 디렉토리가 생성되는데, package.json에는 현 프로젝트가 의존하고 있는 모듈들에 대한 정보가 나와있고, node_modules 디렉토리 안에는 package.json에 있는 모듈과, 그 모듈들이 의존하고 있는 모든 모듈들을 포함하고 있다. 그래서 node_modules 디렉토리 안에는 모듈들의 의존성에 의해 정말 많은 모듈들이 포함되게 된다. npm으로 새로운 모듈을 설치하게 되면 자동으로 package.json과 node_modules에 추가되게 된다.
git에 커밋할 경우, node_modules는 제외할 수도 있다. node_modules가 없어도 package.json에 설치한 패키지들의 정보가 모여있기 때문에, npm install
명령어로 node_modules를 언제든지 추가할 수 있기 때문이다.
package-lock.json은 이 파일(package-lock.json)이 생성되는 시점의 의존성 트리(node_modules)에 대한 정보를 가지고 있는 파일이다. 의존성 트리는 package.json에 등록된 모듈과 그 모듈들이 의존하고 있는 모든 모듈을 포함하고 있기 때문에, 결국 package-lock.json도 이 모든 모듈들의 정보를 가지고 있다. npm을 사용해서 node_modules나 package.json을 수정하게 되면, package-lock.json도 자동으로 업데이트 된다.
package.json 파일에는 의존성 모듈(dependencies)의 version range가 사용된다.
versiong range란, 특정 버전이 아닌 버전의 범위를 말한다. 예를 들어서 npm install express
로 익스프레스를 설치하면, package.json에는 '^4.10.3' 이런 식으로 버전 범위가 추가되게 된다. 이 버전의 익스프레스가 추가된 package.json을 가지고 npm install
을 하게되면 4.10.3 버전이 설치되지만, 익스프레스의 버전이 업데이트된 후에 동일한 package.json 파일 정보를 가지고 npm install
을 하게되면 4.10.3 버전이 아닌 새로 업데이트된 버전으로 익스프레스가 변경된다. 이럴 경우에 기존에 가지고 있던 node_modules에 있던 모듈의 버전과 충돌이 일어나, 오류를 발생 시킬 수 있다. 이 문제를 해결하기 위해 package-lock.json을 사용하는 것이다.
package-lock.json은 node_modules에 대한 정보를 가지고 있는데, package-lock.json이 업데이트되는 시점에 node_modules를 재생성할 수 있다. 그래서 package-lock.json 파일이 있다면, npm install
로 package.json, package-lock.json에 있는 모듈들이 새로 업데이트 되는 동시에, node_modules가 새로 생성되어, 각 파일이 가지고 있는 모듈의 버전을 동일하게 맞출 수 있게 되는 것이다.
package-lock.json에 모든 모듈의 버전은 npm install
을 수행하는 시점에 따라 달라지게 된다. npm install
을 수행하는 시점에 업데이트 되어있는 모듈의 버전으로 업데이트가 된다. 이렇게 되면 package.json과 package-lock.json에 있는 모듈이 같은 버전으로 업데이트가 되고, 이때 package-lock.json에 있는 모듈 정보 때문에 node_modules가 재생성되어, 3개의 파일에 있는 모듈이 모두 같은 버전으로 맞춰지게 되어 오류가 안나게 된다.
이러한 이유로 node_modules는 git에 커밋할 경우 빠질 수 있는 파일이지만, package.json과 package-lock.json은 같이 커밋해야한다.
node_modules
실제로 설치된 의존성 모듈들이 모두 들어있는 디렉토리. 애플리케이션이 사용할 코드는 여기서 가져다 쓰게 된다.
package.json
npm istall 을 할 때 기준이 되어주는 파일. 대략적인 의존성의 버전을 관리한다.
package-lock.json
프로젝트에 설치되어야하는 의존성의 정확한 버전을 관리해주는 파일. package.json을 보면 ^4.10.3과 같은 버전의 대략적인 범위를 보여주는 반면 package-lock.json은 구체적인 버전명이 명시되어있다. 프로젝트가 동일한 의존성을 가질 수 있도록 하는 역할을 한다.