본문 바로가기
C.W.K.
Stream
Lesson 08 of 12 · published

버전 번호 (Semver)

~6 min · SemVer, version, validation

Level 0패턴 호기심
0 XP0/90 lessons0/15 achievements
0/100 XP to next level100 XP to go0% complete

가장 단순한 버전 모양은 세 숫자 묶음이야

시맨틱 버전의 중심은 MAJOR.MINOR.PATCH 형식이야.

^[0-9]+\.[0-9]+\.[0-9]+$

이 패턴은 점으로 이은 ASCII 숫자 세 묶음을 요구해서 1.0.0은 받아들이고 1.0은 거부해. 다만 선행 0을 비롯한 SemVer의 모든 규칙까지 검사하지는 않아.

정식 SemVer에는 사전 릴리스와 빌드 정보도 있어

1.0.0-alpha, 1.0.0-rc.1 같은 사전 릴리스와 1.0.0+build.123 같은 빌드 메타데이터까지 포함하면 패턴이 길어져.

^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$

이 패턴을 외우지 말고 SemVer 명세의 최신 권장 표현을 확인해. 단순 검색이라면 짧은 패턴으로 충분하고, 명세 준수 검증이라면 검증된 라이브러리가 더 안전해.

필요한 엄격함을 먼저 정해

문서에서 버전처럼 보이는 문자열만 찾는다면 [0-9]+\.[0-9]+\.[0-9]+로 시작할 수 있어. 패키지 게시나 의존성 해석처럼 의미가 중요한 자리에서는 전체 규칙을 적용해야 해.

버전의 크기는 정규식으로 비교하지 마

숫자와 사전 릴리스 규칙을 해석하는 일은 Python의 packaging.version.parse, Node의 SemVer 패키지, Go의 golang.org/x/mod/semver 같은 도구에 맡겨. 정규식은 조각을 찾을 수는 있어도 버전 우선순위 규칙을 대신하지 못해.

Code

Semver 패턴·python
import re

# 단순
SEMVER = re.compile(r'^\d+\.\d+\.\d+$')
bool(SEMVER.fullmatch('1.0.0'))      # True
bool(SEMVER.fullmatch('1.0.0-rc'))   # False
bool(SEMVER.fullmatch('1.0'))        # False

# Optional v-prefix 있는 문자열에서 버전 추출
VERSION = re.compile(r'\bv?(\d+\.\d+\.\d+)(?:-([\w.]+))?(?:\+([\w.]+))?\b')
m = VERSION.search('release v2.3.1-beta.2 deployed')
print(m.group(1))  # '2.3.1'
print(m.group(2))  # 'beta.2'

# 비교엔 라이브러리
from packaging.version import Version

v1 = Version('1.10.0')
v2 = Version('1.9.0')
v1 > v2  # True (문자열 비교가 아니라 숫자 비교)

External links

Exercise

CHANGELOG에서 버전 번호를 모두 추출한 뒤 SemVer 라이브러리로 정렬해. 단순 문자열 정렬 결과와 비교해서 2.10.02.9.0보다 뒤에 놓여야 하는 이유를 확인해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.