티스토리 뷰

320x100

이 글은 주니어 개발자가 쓴 글로 오류가 있을 수 있습니다.

문제가 있거나 수정이 필요한 부분은 댓글로 알려주시면 감사하겠습니다.

2.17.0
[MAJOR].[MINOR].[PATCH]

What - Semantic Versioning이란 무엇인가

소프트웨어 버전 작성 명세이다.

소프트웨어의 특정 상태에 대해 버전 이름 혹은 버전 번호를 작성하여 사용자들에게 해당 버전에서 제공되는 API를 알릴 때 사용한다.

그라바타(Gravatars)의 창시자이자 깃헙(GitHub)의 공동창업자인 톰 프레스턴-베르너(Tom Preston-Werner)가 작성했다.

Why - 왜 Semantic Versioning을 사용해야 하는가

버전 관리는 여러 방식으로 작성될 수 있으나, 특정한 정식 명세에 따르지 않는다면 해당 번호에 대한 의미가 명확히 전달되지 않으므로 무의미하다. 정식 명세를 따르면 소프트웨어 사용자에게 제작자의 의도를 정확히 전달하기 쉽다.

How

[MAJOR].[MINOR].[PATCH]

  • MAJOR version(주 버전): API 수정/삭제 등으로 이전 버전과 호환되지 않는 경우 올린다.
  • MINOR version(부 버전): API 추가로 이전 버전과 호환되는 변경이 있는 경우 올린다.
  • PATCH version(수 버전): 이전 버전과 호환되면서 버그 픽스를 했을 경우 올린다.

Sepecification(명세)

  1. 반드시 공개 API를 선언한다. 코드 자체로 선언하거나 문서로 엄격히 명시해야 한다.
  2. 버전 번호는 [MAJOR].[MINOR].[PATCH] 형태로 각각 자연수이며 감소하면 안 된다.
  3. 특정 버전으로 배포하고 나면, 그 버전의 내용은 절대 변경하지 말아야 한다. 변경분이 있다면 반드시 새로운 버전으로 배포한다.
  4. 주 버전 0(0.y.z)은 초기 개발 용도로 마음대로 바꿀 수 있다.
  5. 1.0.0 버전은 공개 API를 정의하고 이후 버전이 올라갈 때마다 변경 사항을 공지한다.
  6. 수 버전(PATCH)은 반드시 그 전 버전과 호환되게 버그를 수정한 경우에만 올린다.
  7. 부 버전(MINOR)은 기존 기능과 호환되는 새로운 기능을 추가할 때 올린다. 일부 기능에 deprecate 표시를 한 경우에도 올린다. 내부 코드에 기능이 대폭 추가되거나 개선사항이 있을 때 올릴 수도 있다. 하위 버전의 변화를 포함할 수 있다. 버전을 올리면 하위 버전을 반드시 0으로 초기화한다.
  8. 주 버전(MAJOR)은 기존 버전과 호환되지 않는 변경이 있을 때에 올린다. 하위 버전의 변화를 포함할 수 있다. 버전을 올리면 하위 버전을 반드시 0으로 초기화한다.
  9. 수 버전 뒤에 하이픈(-)을 붙이고 pre-release 버전을 표기할 수 있다. 식별자는 마침표(.)로 구분되며 아스키 문자, 숫자, 하이픈으로 구성한다 [0-9A-Za-z-]. pre-release 버전은 아직 불안정하며 연관된 버전에 대해 호환성이 충족되지 않을 수 있다. ex) 1.0.0-alpha, 1.0.0-3.7, 1.0.0-x.7.z.92
  10. 빌드 메타데이터는 수 버전이나 pre-release 버전 식별자 뒤에 더하기(+) 기호를 붙인 후 표현할 수 있다. 빌드 메타데이터가 붙은 버전끼리는 순서가 같다.
  11. 버전 순서는 아래와 같다.
    • 주, 부, 수 버전은 숫자로 비교한다. ex) 1.0.0 < 2.0.0 < 2.1.1
    • 주, 부, 수 버전이 같을 경우, pre-release가 표기된 버전이 먼저다. ex) 1.0.0-alpha < 1.0.0
    • 주, 부, 수 버전이 같고 둘 다 pre-release가 표기되었다면, pre-release가
      • 숫자로만 구성된 경우, 숫자로 비교한다.
      • 알파벳이나 하이픈이 포함된 경우, 아스키 문자열 기준으로 정렬한다.
      • 숫자만 있는 경우가 문자와 하이픈이 포함된 경우보다 이전 버전이다.
      • ex) 1.0.0-alpha < 1.0.0-alpha.1 < 1.0.0-alpha.beta < 1.0.0-beta < 1.0.0-beta.2 < 1.0.0-beta.11 < 1.0.0-rc.1 < 1.0.0

SemVer(for npm)

버전 범위

부등호(<, <=, >, >=) 혹은 등호(=)를 사용하여 충족하는 버전의 범위를 설정할 수 있다.

>1.2.7: 1.2.7보다 큰 버전

>=1.2.7 <=1.3.0: 1.2.7과 같거나 크고 1.3.0과 같거나 작은 버전

^(caret, 캐럿)

0이 아닌 가장 좌측 값이 바뀌지 않는 버전을 허용한다.

^1.2.3 := >=1.2.3 <2.0.0-0

^0.2.3 := >=0.2.3 < 0.3.0-0

^0.0.3 := >=0.0.3 < 0.0.4-0

~(tilde, 틸드, 물결표)

수 버전이 있으면 해당 수 버전보다 큰 버전을 허용하고, 수 버전이 없으면 해당 부 버전 내의 모든 버전을 허용하고, 부 버전이 없으면 해당 주 버전 내의 모든 버전을 허용한다.

즉, 현재 지정된 버전의 마지막 자리 범위 내에 버전 변경 허용한다.

~1.2.3 := >=1.2.3 <1.3 := 1.2.3 - 1.3

~1.2 := >=1.2.0 <1.3 := 1.2.x

~1 := >=1.0.0 < 2.0.0 := 1.x


참고자료

유의적 버전 2.0.0-ko2

Semantic Versioning 2.0.0

node-semver - 추가 예시 참고

320x100

'개발 > 용어 정리' 카테고리의 다른 글

유니코드와 UTF-16  (0) 2021.05.16
인증인가(Authentication/Authorization)  (0) 2021.05.16
댓글