시맨틱 버전(SemVer) 비교기 완벽 가이드
시맨틱 버전(Semantic Versioning, SemVer)은 MAJOR.MINOR.PATCH 형식으로 소프트웨어 버전을 표기하는 국제 표준 규격입니다. package.json의 dependencies, npm 패키지, 라이브러리 릴리스 태그 등 개발 현장 어디서나 사용되지만, 두 버전 중 어느 쪽이 더 최신인지, 목록을 어떤 순서로 정렬해야 하는지, 특정 범위식(^, ~, 비교 연산자)에 어떤 버전이 해당하는지를 손으로 계산하려면 실수가 잦습니다. 이 도구는 SemVer 2.0.0 명세의 우선순위(precedence) 규칙을 그대로 구현해 즉시 결과를 보여줍니다.
버전 비교는 먼저 MAJOR, MINOR, PATCH를 숫자로 비교합니다. 값이 다르면 큰 쪽이 상위 버전입니다. 세 값이 모두 같다면 프리릴리스(pre-release, -beta.1처럼 하이픈 뒤에 붙는 식별자) 유무를 봅니다. 프리릴리스가 없는 정식 버전(예: 1.0.0)은 프리릴리스가 있는 버전(예: 1.0.0-alpha)보다 항상 상위입니다. 양쪽 모두 프리릴리스가 있다면 마침표(.)로 구분된 식별자를 왼쪽부터 하나씩 비교하는데, 숫자로만 된 식별자는 산술적으로, 문자가 섞인 식별자는 아스키 사전순으로 비교하며, 숫자 식별자는 항상 문자 식별자보다 낮은 우선순위를 가집니다. 식별자 개수가 다르면 더 적은 쪽이 먼저 끝나므로 낮은 버전으로 취급됩니다. 빌드 메타데이터(+build.5처럼 더하기 뒤에 붙는 부분)는 비교에 전혀 영향을 주지 않습니다.
범위식은 npm 생태계에서 널리 쓰이는 caret(^)과 tilde(~) 표기를 지원합니다. ^1.2.3은 왼쪽에서부터 처음 나오는 0이 아닌 자리를 고정한 채 그 이하 자리는 자유롭게 올라갈 수 있다는 뜻으로, 1.2.3 이상 2.0.0 미만을 허용합니다. 메이저 버전이 0인 경우(예: ^0.2.3)에는 마이너 자리가 고정되어 0.2.3 이상 0.3.0 미만만 허용하고, ^0.0.3처럼 마이너까지 0이면 패치 자리만 고정되어 0.0.3 이상 0.0.4 미만으로 매우 좁게 제한됩니다. ~1.2.3은 패치 버전만 자유롭게 올라갈 수 있어 1.2.3 이상 1.3.0 미만을 의미합니다. 이 외에도 >=, <=, >, <, = 비교 연산자를 공백으로 연결해 >=1.0.0 <2.0.0처럼 AND 조건을 만들 수 있고, ||로 여러 조건 묶음을 연결하면 OR 조건도 표현할 수 있습니다.
이 도구는 세 가지 입력을 동시에 처리합니다. 첫째, 버전 A와 B를 입력하면 어느 쪽이 크고 그 이유가 무엇인지(메이저 차이인지, 프리릴리스 차이인지)를 알려줍니다. 둘째, 여러 줄의 버전 목록을 입력하면 SemVer 우선순위 규칙에 따라 오름차순으로 정렬한 결과를 보여줍니다. 셋째, 대상 버전과 범위식을 입력하면 해당 버전이 그 범위를 만족하는지(O/X)와 함께 실제 허용 범위를 사람이 읽을 수 있는 문장으로 풀어서 보여줍니다. 세 섹션은 독립적으로 동작하므로 필요한 항목만 채워도 됩니다.
자주 묻는 질문 (FAQ)
Q. 1.2.0과 1.10.0 중 어느 것이 더 최신 버전인가요?
A. 1.10.0이 더 상위입니다. 문자열로 보면 "1.2"가 "1.10"보다 커 보이지만, SemVer는 각 자리를 숫자로 비교하므로 마이너 버전 10이 2보다 큽니다. 이 도구는 문자열이 아닌 숫자 비교를 수행해 정확한 결과를 보여줍니다.
Q. 1.0.0-alpha와 1.0.0 중 무엇이 더 상위 버전인가요?
A. 프리릴리스가 없는 1.0.0이 더 상위입니다. SemVer 규칙상 alpha, beta, rc 등 프리릴리스 식별자가 붙은 버전은 정식 배포 전 단계이므로 같은 major.minor.patch의 정식 버전보다 항상 낮은 우선순위를 갖습니다.
Q. ^1.2.3과 ~1.2.3은 어떻게 다른가요?
A. ^1.2.3은 1.2.3 이상 2.0.0 미만까지 마이너·패치 업데이트를 폭넓게 허용하는 반면, ~1.2.3은 1.2.3 이상 1.3.0 미만으로 패치 버전 업데이트만 허용합니다. caret은 하위 호환 기능 추가까지, tilde는 버그 수정 패치까지만 허용한다고 이해하면 됩니다.