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

i33W·2021년 10월 28일
5

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

profile
더 오래하면 돼.

17개의 댓글

comment-user-thumbnail
2023년 9월 21일

가끔 궁금했던건데 유익한 글 감사합니다.

답글 달기
comment-user-thumbnail
2023년 12월 10일

Experience the Flixeon Free Movies APK interface, featuring a user-friendly Material Design. Enjoy seamless HD streaming of your preferred movies and TV shows wherever you are, all for free!

답글 달기
comment-user-thumbnail
2023년 12월 10일

SportsFire APK is a live streaming application designed exclusively for broadcasting major global sporting events. The latest version of sportzfy Downlaod TV Apk can be obtained directly from our website.

답글 달기
comment-user-thumbnail
2023년 12월 25일

One of the key aspects that make Geometry Dash online games so appealing is the sense of connectivity they provide.

답글 달기
comment-user-thumbnail
2024년 3월 18일

The practical tips provided prostadine here are exactly what I needed. Thank you!

답글 달기
comment-user-thumbnail
2024년 5월 17일

This is a good question. It reflects thoughtful curiosity and encourages a deeper exploration of the subject. By asking this, you open the rickys casino door to meaningful dialogue and insightful answers, fostering a greater understanding of the topic.

답글 달기
comment-user-thumbnail
2024년 5월 29일

The Python version installed by default on Raspberry Pi 4 is 3.9 , but the module you want to use only supports up to 3.8.

답글 달기
comment-user-thumbnail
2024년 5월 29일

The Python version installed by default on Raspberry Pi 4 is 3.9 , but the module you want to use only supports up to 3.8.

답글 달기
comment-user-thumbnail
2024년 5월 29일

The Python version installed by default on Raspberry Pi 4 is 3.9 , but the module you want to use only supports up to 3.8.

답글 달기
comment-user-thumbnail
2024년 5월 29일

The Python version installed by default on Raspberry Pi 4 is 3.9 , but the module you want to use only supports up to 3.8.

답글 달기
comment-user-thumbnail
2024년 5월 29일

The Python version installed by default on Raspberry Pi 4 is 3.9 fireboy and watergirl, but the module you want to use only supports up to 3.8.

답글 달기
comment-user-thumbnail
2024년 5월 29일

The Python version installed by default on Raspberry Pi 4 is 3.9 , but the module you want to use only supports up to 3.8.

답글 달기
comment-user-thumbnail
2024년 5월 29일

The Python version installed by default on Raspberry Pi 4 is 3.9 , but the module you want to use only supports up to 3.8.

답글 달기
comment-user-thumbnail
2024년 5월 29일

The Python version installed by default on Raspberry Pi 4 is 3.9 , but the module you want to use only supports up to 3.8.

답글 달기
comment-user-thumbnail
2024년 9월 15일

Ella was never much of a gambler, but when her friend suggested a new online slot game themed around a secret garden, she decided to give it a shot. The game, with its lush visuals and enchanting soundtrack, seemed like https://glorycasinos.biz/ a perfect way to unwind after a long week. Ella started with a modest bet, spinning the reels and enjoying the whimsical animations of flowers and mythical creatures. As she played, the game’s charm began to captivate her, transforming her initial skepticism into genuine enjoyment.

답글 달기
comment-user-thumbnail
2024년 10월 5일

의존하는 모든 패키지의 새 버전을 배포하지 않고는 업그레이드 할 수 없게 되거나, Solar 지나치게 나중 버전까지 호환될 거라 가정한 경우가 그렇다. 버전에 갇히거나 버전이 엉키는 것이다.

답글 달기
comment-user-thumbnail
2024년 10월 16일

이것은 환상적인 읽기였습니다! 귀하의 블로그 게시물은 유익할 뿐만 아니라 매우 잘 정리되어 있습니다. 특히 요점을 설명하기 위해 실제 사례를 제공하여 개념을 훨씬 더 이해하기 쉽고 기억에 남게 만드는 방식이 마음에 들었습니다. 더 많은 콘텐츠를 위해 확실히 돌아올게요 https://solarsmash2.com/

답글 달기