Decision

먼저 결론부터

UUID v4가 맞는 경우

대부분의 웹앱, 일반 API, 추적용 식별자처럼 예측 불가능한 ID만 있으면 되는 경우엔 UUID v4가 기본값으로 충분합니다.

UUID v7이 맞는 경우

이벤트 로그, 메시지 큐, 시계열성 레코드처럼 생성 순서와 정렬 효율이 중요한 워크로드라면 UUID v7이 더 매력적일 수 있습니다.

무조건 v7이 더 좋은 건 아님

라이브러리 호환성, DB 컬럼 타입, 기존 운영 도구, 로그 포맷까지 함께 바뀌는 경우가 많아서 전환 비용도 같이 봐야 합니다.

Trade-offs

실무에서 가장 크게 갈리는 포인트

정렬과 인덱스

UUID v4는 난수 기반이라 삽입 순서가 뒤섞입니다. UUID v7은 시간 기반 비트를 앞에 두기 때문에 일부 저장소에서는 정렬과 인덱스 지역성이 더 나아질 수 있습니다.

가독성과 디버깅

사람이 읽기엔 둘 다 어렵습니다. 그래서 실무에선 표준 UUID 문자열, hex(binary16), 로그용 표시 형식을 함께 다루는 변환 도구가 계속 필요합니다.

운영 중 혼합 상태

기존 시스템이 UUID v4를 쓰고 있는데 일부 서비스만 v7로 넘어가면, 검색 쿼리, 필터, 추적 문서까지 함께 업데이트해야 해서 혼합 상태 관리가 생각보다 까다롭습니다.

Workflow

이 사이트에서 바로 이어서 보는 흐름

  1. 기존 UUID 문자열을 비교하거나 hex(binary16) 저장 방식을 확인할 때는 UUID 변환기를 엽니다.
  2. 시간 정렬형 식별자를 직접 생성해 보고 싶다면 UUID v7 생성기에서 값을 뽑아봅니다.
  3. 정렬 기준을 실제 시간으로 다시 확인하려면 타임스탬프 변환기와 같이 보는 편이 좋습니다.

Examples

실제 입력과 결과

v4와 v7을 나란히 놓고 보기

입력

같은 순간에 각각 3개 생성

결과

v4  f47ac10b-58cc-4372-a567-0e02b2c3d479
v4  1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed
v4  7c9e6679-7425-40de-944b-e07fc1f90ae7

v7  01923f8a-1c4d-7000-8a3b-9f2e1d4c5b6a
v7  01923f8a-1c51-7000-8a3b-2c7d9e4f1a3b
v7  01923f8a-1c55-7000-8a3b-6b1a8c2d7e9f

v7은 앞부분이 거의 같습니다. 밀리초 타임스탬프가 들어 있어서 문자열 정렬만으로 생성 순서가 유지됩니다. v4는 앞부분부터 무작위입니다.

버전 자리 확인법

입력

01923f8a-1c4d-7000-8a3b-9f2e1d4c5b6a

결과

세 번째 그룹의 첫 글자가 버전
7000 -> v7
4372 -> v4

Troubleshooting

자주 만나는 오류

v4를 기본키로 쓰다 인덱스가 커졌을 때

v4는 완전 난수라 B-tree 인덱스 곳곳에 삽입되어 페이지 분할이 잦고 캐시 적중률이 떨어집니다. 행이 수백만 건으로 늘어난 뒤에 체감되는 문제라 초기 설계에서 놓치기 쉽습니다. v7은 끝에 순차적으로 붙어 이 비용을 줄입니다.

공개 URL에 v7을 쓰면 시각이 노출됩니다

v7에는 생성 밀리초가 그대로 들어 있어 가입 시점이나 주문 시각을 역산할 수 있습니다. 경쟁사가 가입자 증가 속도를 추정할 수도 있습니다. 외부에 노출되는 식별자는 v4가 맞습니다.

두 버전을 한 컬럼에 섞어도 되는지

형식이 같아 저장은 문제없지만 정렬 보장이 깨집니다. v7끼리는 시간순이어도 섞인 v4는 무작위 위치에 들어갑니다. 마이그레이션할 때는 정렬에 의존하는 쿼리가 있는지 먼저 확인하세요.