Semantic Version과 Version Range Syntax

웅평·2023년 7월 20일
0

Semantic Version이란?

dependencies 필드에 있는 각 패키지 이름 옆의 버전은 Semantic Version이라고 한다


X를 메이저 버전(major version)
Y를 마이너 버전(minor version)
Z를 패치 버전(patch version)

API란 Application Programming Interface의 약자로 '외부에서 사용할 수 있도록 공개된 함수'를 의미

첫 번째로 가장 오른쪽의 패치 버전은 API에 변화를 주지 않는 범위 내에서의 변화가 이루어진 경우에 업데이트한다.
겉으로 공개된 API는 바뀌지 않았지만 코드에 존재하던 버그를 해결하거나 알고리즘을 바꿔서 그 효율성을 향상시킨 경우 등이 해당
예를 들어 버전을 2.3.1에서 2.3.2로 올릴 수 있다. 2.3.1에서 바로 2.4.0이나 3.0.0으로 업데이트하면 안된다.

두 번째로 가운데에 있는 마이너 버전은, 이전 버전의 API와 호환되는(backward-compatible) API 상의 변화가 발생했을 때 업데이트한다.
예를 들어 새로운 API를 추가한 경우 2.3.1 버전에서 새로운 API를 추가하면 2.4.0으로 버전을 올리면 된다. 그럼 기존의 2.3.1 버전의 패키지를 믿고 사용했던 다른 곳에서 이 패키지의 2.4.0 버전을 사용해도 괜찮다. 왜냐하면 API 상의 변화가 생기긴 했지만 이미 존재했던 API들은 건드리지 않는 범위의 변화(단순 API 추가)가 발생한 것이기 때문이다.

마지막으로 가장 왼쪽의 메이저 버전은, 이전 버전의 API와 호환되지 않는(not backward-compatible) API 상의 변화가 발생했을 때 업데이트한다.
기존의 API를 아예 삭제했거나 그 이름을 바꾸는 등의 변화가 이것에 해당하는데 이럴 때는 원래 2.3.1 버전이었다면 3.0.0으로 버전을 올려줘야 한다.

위의 사진처럼 cookie이라는 패키지가 존재하고 express 패키지가 cookie 패키지를 필요로 한다고 가정한 후 Version Range Syntax를 알아보자

(1) Basic Syntax

"cookie" : "2.3.1"
이렇게 쓰여 있으면 정확히 2.3.1 버전의 cookie 패키지가 필요하다는 뜻

"cookie" : ">2.3.1"
2.3.1보다 높은 버전의 cookie 패키지가 필요하다는 뜻

"cookie" : "2.3.1 || ≥2.5.0 <3.1.2"
2.3.1 버전의 cookie 패키지 또는 2.5.0 버전 이상이면서 3.1.2 버전 미만의 cookie 패키지가 필요하다는 뜻
||(or)는 왼쪽 조건과 오른쪽 조건 중 하나를 만족해야 한다는 뜻이고, ≥2.5.0 <3.1.2 사이의 공백 하나는 왼쪽과 오른쪽 조건 둘 다(&, and)를 만족해야 한다는 뜻.

(2) Advanced Syntax

1) Hyphen Range
"cookie" : "2.3.1 - 3.1.2"
2.3.1 버전 이상 3.1.2 버전 이하의 cookie 패키지가 필요하다는 뜻
이것은 ≥2.3.1 ≤3.1.2 을 줄여서 표시한 것이라고 생각하면 된다. 이때 패치 버전이나 마이너 버전을 표시하지 않는 경우도 있을 수 있는데

예를 들어, 2.3 - 3.1.2이면 자동으로 ≥2.3.0 ≤3.1.2 으로 빈자리에 0이 붙어서 해석된다.
하지만 만약 그런 버전이 오른쪽에 있다면

예를 들어 2.3.1 - 3.1 이면 ≥2.3.1 <3.2.0 이렇게 다르게 해석된다.
같은 원리로 2.3.1 - 3 이면 ≥2.3.1 <4.0.0 이렇게 해석된다.

2) X-range
"cookiet" : "*"
어느 버전의 cookie 패키지도 상관없다는 뜻

"cookie" : "3.x"
x에는 어떤 버전이 들어가도 상관없다는 뜻
즉, ≥3.0.0 <4.0.0 과 같은 뜻
참고로 그냥 3이라고만 써있어도 3.x로 해석이 되어서 ≥3.0.0 <4.0.0 라는 뜻

"cookie" : "3.1.x"
같은 원리로 ≥3.1.0 <3.2.0 라는 뜻
참고로 그냥 3.1이라고만 써있어도 3.1.x로 해석이 되어서 ≥3.1.0 <3.2.0 라는 뜻

3) Tilde Range
위에서 봤던 물결 모양 기호(~, Tilde, 틸드)를 사용한 표기법인데 이 경우에는 마이너 버전이 표시된 경우는 패치 버전 업데이트까지만 허용하고, 마이너 버전이 없으면 마이너 버전의 업데이트까지 허락한다.

"cookie" : "~3.1.2"
이런 경우는 ≥3.1.2 <3.2.0 이렇게 해석이 된다. 지금 3.1.2에 마이너 버전이 존재하므로 패치 버전이 업데이트된 것들만 허용한다.

"cookie" : "~3.1"
만약 이렇게 패치 버전이 적혀있지 않다면 ≥3.1.0 <3.2.0 이렇게 해석된다. 지금 3.1에 마이너 버전이 존재하므로 패치 버전이 업데이트된 것들만 허용한다. 생략된 패치 버전은 0부터 시작한다.

"cookie" : "~3"
만약 마이너 버전도 적혀있지 않다면 ≥3.0.0 <4.0.0 이렇게 해석된다. 즉, 마이너 버전이나 패치 버전이 업데이트된 버전들만 허용한다.

4) Caret Range
메이저 버전, 마이너 버전, 패치 버전 중에서 현재 보이는 가장 왼쪽의 0이 아닌 버전이 바뀌지 않는 선에서의 버전 업데이트만을 허용한다.

"cookie" : "^1.2.3"
가장 왼쪽의 0이 아닌 버전, 즉, 1이 바뀌지 않는 선에서의 버전 업데이트만 허용한다. 여기서는 ≥1.2.3 <2.0.0 이라는 뜻

"cookie" : "^0.2.3"
가장 왼쪽의 0이 아닌 버전, 2가 바뀌지 않는 선에서의 버전 업데이트만 허용한다. ≥0.2.3 <0.3.0 이라는 뜻

"ccookie" : "^0.0.3"
가장 왼쪽의 0이 아닌 버전, 3이 바뀌지 않는 선에서의 버전 업데이트만 허용한다. ≥0.0.3 <0.0.4 이라는 뜻

참고
코드잇

1개의 댓글

comment-user-thumbnail
2023년 7월 20일

정말 좋은 정보 감사합니다!

답글 달기