목차

  • package.json 개념
  • 시멘틱 버저닝(SemVer) 규칙
  • package.json 구조 분석
  • 내용정리

 

 

package.json

Nest.js 프로젝트를 생성하면 package.json 이 기본적으로 생성된다.

이 package.json의 역할은 무엇일까?

package.json에는 해당 어플리케이션이 필요로 하는 패키지 목록을 나열하는 역할을 한다.

내부 구조를 보면 필요한 패키지의 버전까지 명시되어있다.
이에 따라 의존성이 달라 발생하는 문제를 예방하며 다른 개발자와 동일한 빌드환경을 구성할 수 있다.

 

즉, package.json은 각 개발환경을 구성할 때 의존성 문제를 해결하기 위해 존재한다고 보면 된다.

 

package.json은 내부적으로 버저닝 규칙이 있다.

이를 시멘틱 버저닝 규칙이라고 하는데, 아주 상세한 내용은 https://semver.org/ 여기를 참고 하면 된다.

 

시멘틱 버저닝 규칙

//구조 
[Major].[Minor].[Patch]-[label]

//실제 예시
1.2.3-beta
  • Major : 이전 버전과 호환이 불가능할 때 숫자를 증가시킨다. 메이저 규칙이 바뀐 경우 반드시 하위 호환성이 깨진 기능들의 목록을 확인하고 코드를 수정해야한다.
  • Minor : 기능이 추가되는 경우 숫자를 증가시킨다.
  • Patch : 버그 수정 패치를 적용할 때 사용한다.
  • label : 선택사항으로, pre, beta와 같은 버전에 대한 부가 설명을 위해 문자열로 작성한다.

 

시멘틱 버저닝은 특이하게 완전히 동일한 버전만을 정의하는 것이 아닌 다양한 규칙으로 의존석이 깨지지 않는 다른 버전을 설치 할 수 있다. 여기서 ver은 기준이 되는 버전을 뜻한다.

ver 완전히 일치하는 버전  
=ver 완전히 일치하는 버전  
>ver 큰 버전  
>=ver 크거나 같은 버전  
<ver 작은 버전  
~ver 버전 범위 ex) ~1.0,1.0.x -> 1.0 이상 1.1 미만의 버전
^ver SemVer규약을 따른 다는 가정에서 동작하는 규칙 ex)
^1.0.2 : 1.0.2 이상 2.0 미만의 버전
^1.0 : 1.0.0 이상 2.0 미만의 버전
^1 : 1.0.0 이상 2.0 미만의 버전

package.json 구조 분석

{
  "name": "패키지 이름",
  "private": true, // private true일 경우 비공개 패키지다.
  "version": "1.0.0", // 패키지 버전
  "description": "패키지 입니다ㅎㅎㅎ 설명",
  "license": "MIT", //패키지 라이선스
  "scripts": { // npm run 명령과 함 께 사용할 수 있는 스크립트.
    "start": "nest start",
    "start:dev": "nest start --watch",
    "start:debug": "nest start --debug --watch"
    // 기타등등.......
  },
  "dependencies": { //패키지가 의존하고 있는 다른 패키지를 기술한다.
    "@nestjs/common": "^8.0.6"
  },
  "devDependencies": { // 개발할 때만 필요한 패키지를 기술한다.
    "@nestjs/cli": "^8.1.1"
  },
  "jest": { // 테스트를 위한 환경 구성 옵션이다. NestJS는 기본으로 Jest를 이용한 테스트를 제공한다.
  // 어쩌구 저쩌구
  }
}

 

 

package-lock.json

 프로젝트 루트 디렉토리에서 npm install 명령어를 실행하면, node_modules 디렉토리와 package-lock.json 이 자동생성 된다.

그리고 pakage-lock.json 파일은  node_modules나 package.json 파일의 내용이 바뀌면 npm intall 명령을 수행할 때 자동 수정된다.

 node_modules 는 프로젝트가 필요로 하는 패키지들이 실제로 설치되는 장소다.

어플리케이션은 런타임에 여기 설치된 패키지들을 참조한다.

package-lock.json 파일은 package.json 에 선언된 패키지들이 실치될 때의 정확한 버전과 서로간의 의존성을 표현한다.

따라서 팀원들 간에 정확한 개발환경을 공유할 수 있게된다.

그렇기 때문에 node_modules 소스는 리포지토리에 따로 공유하지 않아도 되지만

package-lock.json 파일은 정확한 의존성을 위해 리포지토리에서 관리해야한다.

소스내에 package-lock.json 파일이 있다면 이 파일을 기준으로 패키지들을 설치하게 되기 때문이다.

 

 

내용정리

  • 결과적으로 package.json 을 통해 npm build를 하고 이때 생성된 생성된 package-lock.json 또한 repository에 함께 관리해야 정확한 의존성을 관리 할 수 있다.
  • 위의 두 개로의 json 파일로 의존성 관리가 되기 때문에 node_modules 폴더는 repository로 관리 하지 않는 것이 좋다.

 

 

참고자료

- NestJS로 배우는 백엔드 프로그래밍

+ Recent posts