Search
📱

시멘틱 버저닝

날짜
2024/08/22
파트
안드로이드
서기
블로그 업로드 여부

버저닝?

사실 버전은 소프트웨어가 동작하는데에는 영향을 미치지 않지만, 이 프로그램이 언제 만들어졌는지, 어떠한 기능이 추가되고 바뀌었는지, 패키지의 변화를 구분하기 위해서 반드시 필요한 존재이다.
그렇다면, 우리 마음대로 버전을 붙이면 되는 걸까?
만약 개인이 운영을 한다면 상관없다. 그러나 기업에서 공동으로 제작을 하거나, 라이브러리를 배포하면 사용하는 클라이언트 입장에선 적절한 버전을 선택할 수 있도록 해주어야 할 것이다.
이에 따라 혼란이 발생하지 않도록 그라바타(Gravatars)의 창시자이자 깃헙(GitHub)의 공동창업자인 톰 프레스턴-베르너(Tom Preston-Werner)Semantic Versioning 명세서를 작성했다.

어떻게 쓰면 되는데?

Major(주) : 공개 API에 기존과 호환되지 않는 변화가 있을 경우
주버전 0(0.y.z)은 초기 개발을 위해서 쓴다. 아무 때나 마음대로 바꿀 수 있다. 이 공개 API는 안정판으로 보지 않는 게 좋다.(1.0.0 버전은 공개 API를 정의한다.)
주버전 번호를 올릴 때는 반드시 부버전과 수버전을 0으로 초기화 한다.
Minor(부) : 공개 API에 기존과 호환되는 새로운 기능을 추가할 경우
부버전이 올라가면 수버전은 반드시 0에서 다시 시작
Patch(수) : 그전 버전 API와 호환되는 버그 수정의 경우
수버전 바로 뒤에 붙임표(-)를 붙이고 마침표(.)로 구분된 식별자를 더해서 정식 배포를 앞둔 (pre-release) 버전을 표기할 수 있다.
식별자는 반드시 아스키(ASCII) 문자, 숫자, 붙임표로만 구성한다[0-9A-Za-z-].
식별자는 반드시 한 글자 이상으로 한다.
숫자 식별자의 경우 절대 앞에 0을 붙인 숫자로 표기하지 않는다.
예시) 1.0.0-alpha, 1.0.0-alpha.1, 1.0.0-0.3.7, 1.0.0-x.7.z.92
빌드 메타데이터는 수버전이나 정식배포 전 식별자 뒤에 더하기(+) 기호를 붙인 뒤에 마침표로 구분된 식별자를 덧붙여서 표현할 수 있다.
식별자는 반드시 아스키 문자와 숫자와 붙임표로만 구성한다 [0-9A-Za-z-].
식별자는 반드시 한 글자 이상으로 한다.
예시) 1.0.0-alpha+001, 1.0.0+20130313144700, 1.0.0-beta+exp.sha.5114f85

우선순위

우선순위는 버전의 순서를 정렬할 때 서로를 어떻게 비교할지를 나타낸다.
우선순위는 반드시 주, 부, 수 버전, 그리고 정식배포 전 버전의 식별자를 나누어 계산하도록 한다 (빌드 메타데이터는 우선순위에 영향을 주지 않는다)

주, 부, 수는 숫자로 비교한다

예시) 1.0.0 < 2.0.0 < 2.1.0 < 2.1.1.

주, 부, 수버전이 같을 경우, 정식배포 전 버전이 표기된 경우의 우선순위가 더 낮다

예시) 1.0.0-alpha < 1.0.0
이때, 숫자로만 구성된 식별자는 수의 크기로 비교하고 알파벳이나 붙임표가 포함된 경우에는 아스키 문자열 정렬을 하도록 한다.
숫자로만 구성된 식별자는 어떤 경우에도 문자와 붙임표가 있는 식별자보다 낮은 우선순위이다.

앞선 식별자가 모두 같은 배포 전 버전의 경우에는 필드 수가 많은 쪽이 더 높은 우선순위를 가진다

예시) 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

알면 좋을 것들

초기 개발 단계에 0.y.z 버전 관리는 어떻게 할까?

가장 간단한 방법은 최초 개발 배포를 0.1.0으로 하고, 이후 배포마다 부버전을 올리는 것이다.

언제 1.0.0을 배포해야 할지 어떻게 알 수 있나?

소프트웨어가 실 서비스에 쓰이기 시작했다면 이미 1.0.0이라고 여길 수 있다. 사용자들이 믿고 쓸 수 있는 안정한 API가 있다면 1.0.0일 것이다. 하위 버전 호환성에 대해 우려하기 시작했다면 이미 1.0.0일 수 있다.

부버전을 올리는데 실수로 호환되지 않는 변경이 들어갔다면 어떻게 해야 하나?

유의적 버전 명세를 어겼다는 사실을 알게 되면, 즉시 문제를 해결하고 호환성이 깨진 부분을 복구해서 새 부버전을 배포한다. 이 경우라도 이미 배포된 버전을 변경해서는 안 된다. 필요한 경우라면 문제가 되는 버전을 문서로 표시해서 사용자들로 하여금 주의하도록 한다.

“v1.2.3”은 시멘틱 버저닝 인가?

“v1.2.3”은 시멘틱 버저닝이 아니다. 그러나, 버전 숫자를 나타내기 위해 시멘틱 버저닝의 접두어로 “v”를 붙이기도 한다.
버전 관리 도구(ex. git)에서 “version”의 축약어로 “v”로 사용하는 것을 흔하게 볼 수 있다.
예: git tag v1.2.3 에서 “v1.2.3”은 tag name이고 유의적 버전은 “1.2.3” 이다.

증빙자료

참고