버전은 어떻게 정하면 좋을까? (Version 1.0.0, 1.0.1, 1.1.0, 2.0.0의 차이)

i33w·2021년 10월 28일
1

Git

목록 보기
1/1

dependency hell과 Semantic Versioning?

의존성 지옥 Dependency hell

소프트웨어 관리의 세계에는 “의존성 지옥”이라 불리는 성가신 문제가 있다. 시스템 규모가 커질수록, 그리고 더 많은 패키지를 가져다 쓸수록 의존성 지옥에 빠지기 쉽다. 의존하는 모든 패키지의 새 버전을 배포하지 않고는 업그레이드 할 수 없게 되거나, 지나치게 나중 버전까지 호환될 거라 가정한 경우가 그렇다. 버전에 갇히거나 버전이 엉키는 것이다.

유의적 버전 명세 Semantic Versioning

이 문제를 해결하여 쉽고 안전하게 프로젝트를 진행할 수 있도록 GitHub의 공동 설립자인 Tom Preston-Werner가 제안한 것이 Semantic Versioning이다.

Semantic Versioning은 버전 번호를 어떻게 정하고 올려야 하는지를 명시하는 규칙과 요구사항들이다. 이 글은 원문 중에서 몇 가지만 정리한 것이다. 원문을 꼭 읽어 보시기 바란다. 원문은 아래 링크에서 확인 가능하고, 한글 번역도 지원한다.

Semantic Versioning 2.0.0 원문 보기

1.0.0의 '.'의 의미

1.0.0은 '.'을 기준으로 3 부분으로 나눌 수 있다.

major.minor.patch
주(主).부(部).수(修)

  • major: 기존 버전과 호환되지 않게 API가 바뀌면 “주(主) 버전”을 올림
  • minor: 기존 버전과 호환되면서 새로운 기능을 추가할 때는 “부(部) 버전”을 올림
  • patch: 기존 버전과 호환되면서 버그를 수정한 것이라면 “수(修) 버전”을 올림

참고: 주.부.수 형식에 정식배포 전 버전이나 빌드 메타데이터를 위한 라벨을 덧붙이는 방법도 있다.

0.0.0과 1.0.0

최초로 개발을 진행할 때는 0.y.z로 시작한다. 초기 개발을 위해 사용하는 0.y.z은 아무 때나 마음대로 바꿀 수 있다.

초기 개발 단계에 0.y.z 버전 관리는 어떻게 할까?
가장 간단한 방법은 최초 개발 배포를 0.1.0으로 하고, 이후 배포마다 부버전을 올리는 것이다.

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

pre-release 버전 표시

수버전 바로 뒤에 붙임표(-)를 붙이고 마침표(.)로 구분된 식별자를 더해서 정식 배포를 앞둔 (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.

버전 우선순위

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

  1. 우선순위는 주(major), 부(minor), 수(patch) 순서로 차례로 비교하면서, 차이가 나는 부분이 나타나면 결정된다.
    예: 1.0.0 < 2.0.0 < 2.1.0 < 2.1.1

  2. 주, 부, 수 버전이 같을 경우, pre-release 버전이 표기된 경우의 우선순위가 더 낮다.
    예: 1.0.0-alpha < 1.0.0

  3. 주, 부 및 패치 버전이 동일한 두 가지 pre-release 버전의 우선 순위는 다음과 같이 차이점이 발견될 때까지 점으로 구분된 각 식별자를 왼쪽에서 오른쪽으로 비교하여 결정해야 한다.

    1. 숫자로만 구성된 식별자는 숫자로 비교한다.
    2. 문자나 하이픈이 있는 식별자는 ASCII 정렬 순서로 사전적으로 비교한다.
    3. 숫자 식별자는 항상 숫자가 아닌 식별자보다 우선 순위가 낮다.
    4. 이전의 모든 식별자가 동일한 경우 더 큰 시험판 필드 집합이 더 작은 집합보다 우선 순위가 높다.

    예: 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개의 댓글