본문 바로가기
Node.js

[Node.js] package.json과 캐럿/눈웃음(^)의 의미

by imsoncod 2022. 9. 27.

개요

Node.js 프로젝트를 진행하면 항상 package.json 파일을 마주하게 된다. package.json 파일은 보통 아래와 같은 정보를 포함하고 있다.

  1. 프로젝트의 정보(이름, 버전, 개발자 등..)
  2. 커스텀 명령어
  3. 프로젝트가 의존하고 있는 패키지들의 정보

이정도면 package.json은 그냥 하나의 문서라고 부르는게 더 맞는 것 같다.
아무튼 프로젝트를 진행하다가..
package.json 문서에는 typeorm: "^0.2.32"로 되어 있는데 실제로는 0.2.45 버전이 설치되어 있어서, 뭐지? 하고 찾아보다가 눈웃음(^) 문자의 역할에 대해 알게되었다.

버전

우선 버전 형식에 대해 간단히 알아보자. 보통 각종 npm 모듈들의 버전은 x.x.x 형식으로 되어 있는걸 볼 수 있는데, 각 자리가 아래와 같은 의미를 갖는다고 한다.

[Major] . [Minor] . [Patch]

  • Major: 하위 버전의 모듈과 호환성이 보장되지 않는 업데이트시 증가
  • Minor: 하위 버전의 모듈과 호환성을 보장하면서 기능 업데이트시 증가
  • Patch: 하위 버전의 모듈과 호환성을 보장하면서 버그 수정시 증가

요걸 Semantic Versioning 규칙이라고 부르는데, npm 모듈들은 업데이트시 위 규칙을 따른다고 한다.
강제성이 있는 것 같지는 않고, 하나의 약속/국룰 같은 느낌이다.
왠지 npm 모듈뿐만 아니라 여러 라이브러리, 앱 버전 등 버저닝할 때 쓰는 표준 규칙 같기도 하다. 이제 눈웃음(^)에 대해 알아보자.

캐럿(^)

눈웃음(^) 문자를 캐럿이라고 부른다고 한다. 처음 알았다 캐럿캐럿
npm 모듈 버전 앞에 캐럿을 붙이게 되면, Major 버전 외 나머지 Minor, Patch 버전을 가장 최신으로 업데이트 한다고 한다.
캐럿의 자동 업데이트 기능은, npm 모듈들이 Semantic Versioning 규칙을 지킨다는 것을 신뢰한다는 가정하에 동작한다고 한다.

[예시]
위에 언급했던 typeorm: "^0.2.32"를 예시로 보면,
Major(0) 버전 외 Minor(2), Patch(32) 버전을 가장 최신으로 업데이트 하겠다는 뜻이 된다.
식으로 정의하면 0.2.32 <= target version < 1.0.0 처럼 인식하는 것이다.
음? 근데 typeorm 모듈은 작성일 기준 0.3.10 버전이 가장 최신이다.
그렇다면 이론상 0.3.10 까지 업데이트가 되어야 할 것 같은데, 왜 0.2.45 로 업데이트가 되었을까?

[예외]
Semantic Versioning 규칙에서 예외가 존재한다고 한다. 내용은 아래와 같다.
"일반적으로 소프트웨어는 1.0.0 버전을 내놓기 전에 많은 시행착오와 수정이 반복되기 때문에, 1.0.0 미만 즉 0.x.x 버전은 Pre-Release 상태로 간주하고 package.json 에 지정한 버전의 마지막 자릿수 내에서만 업데이트를 합니다"
그렇다, typeorm 모듈은 1.0.0 미만의 버전이고 0.2.32 세 자리로 지정해 주었기 때문에, 마지막 자리인 Patch 버전 내에서 최신인 45로 업데이트를 한 것이다.
업데이트 로그를 보면 0.2.45 이후 0.3.0 으로 업데이트 한 것을 확인할 수 있다)

에필로그

npm 1.4.3 버전부터 아래 두 명령어로 모듈 설치시 Default로 버전 앞에 캐럿이 붙는다고 한다.

  • npm install {module} --save
  • npm install {module} --save-dev

버전을 고정시키고 싶을 경우, 캐럿을 제거해버리자.

반응형

'Node.js' 카테고리의 다른 글

[Node.js] Express와 미들웨어  (0) 2020.12.31
[Node.js] Node.js 개념 및 특징(+동기와 비동기)  (0) 2020.12.24

댓글