UUID 설명: 버전·활용 사례·자동 증가 대신 쓰는 경우
출처: Dev.to
UUID(범용 고유 식별자)는 현대 애플리케이션 거의 모든 곳에서 사용됩니다 — 데이터베이스 기본키, API 리소스 ID, 세션 토큰, 파일 이름, 상관관계 ID 등. 하지만 UUID에는 여러 버전이 존재하고, 각각의 트레이드오프가 있으며, 자동 증가 정수형이 더 나은 선택이 되는 경우도 많습니다. 여기 실용적인 정리를 제공합니다.
UUID는 128비트 식별자로, 5개의 그룹으로 구분된 32개의 16진수 문자로 표현됩니다:
550e8400-e29b-41d4-a716-446655440000
형식은 8-4-4-4-12 문자이며, 세 번째 그룹의 첫 번째 숫자가 버전을 나타냅니다(위 예시: 4). 네 번째 그룹의 첫 번째 숫자는 변형(variant)을 나타냅니다.
올바르게 생성된 UUID가 충돌할 확률은 실질적으로 불가능할 정도로 낮습니다.
- UUID v1 — 시간 기반 + MAC 주소
- UUID v4 — 무작위
- UUID v5 — 이름 기반(SHA‑1)
- UUID v7 — 시간 순서 무작위(최신)
사용 예시
JavaScript (브라우저 / Node.js, 최신)
const id = crypto.randomUUID(); // 네이티브, 라이브러리 불필요
Node.js (uuid 패키지 사용)
import { v4 as uuidv4 } from 'uuid';
const id = uuidv4();
Python
import uuid
id = str(uuid.uuid4())
Go
import "github.com/google/uuid"
id := uuid.New().String()
Ruby
require 'securerandom'
id = SecureRandom.uuid
PostgreSQL
SELECT gen_random_uuid(); -- PostgreSQL 13+
UUID v7 (아직 보편적 지원은 아니지만 라이브러리 통해 사용 가능)
JavaScript
import { v7 as uuidv7 } from 'uuid'; // uuid 패키지 v9+
const id = uuidv7();
Python
import uuid
id = str(uuid.uuid7()) # Python 3.13+
Java (JUG 라이브러리)
UUID id = Generators.timeBasedEpochGenerator().generate();
.NET 9+
Guid id = Guid.CreateVersion7();
언제 자동 증가 정수를 사용하고 언제 UUID를 사용해야 할까?
자동 증가 정수를 사용해야 할 경우
- ID가 내부 전용이며 사용자가 절대 보지 못하고 URL에도 나타나지 않을 때
- 저장 공간을 가장 작게 유지하고 싶을 때(4 바이트 또는 8 바이트 vs UUID는 16 바이트)
- ID의 순차적 순서가 의미가 있을 때(예: 행 1001이 행 1000 뒤에 삽입된 것을 알고 싶을 때)
- 복제나 병합 문제가 없는 단일 데이터베이스 서버를 운영할 때
UUID를 사용해야 할 경우
- ID가 URL, API, 혹은 클라이언트‑사이드 코드에 노출될 때(UUID는 개수나 순서를 드러내지 않음)
- 클라이언트에서 데이터베이스에 쓰기 전에 ID를 생성해야 할 때(모바일, 오프라인‑우선 앱 등)
- 여러 데이터베이스 노드, 복제본, 혹은 ID 충돌 없이 데이터를 병합해야 할 때
- 마이크로서비스 아키텍처에서 각 서비스가 독립적으로 레코드를 생성할 때
데이터베이스 기본키로는 UUID v7을 v4보다 선호하세요. 무작위 v4 UUID는 B‑tree 인덱스에서 각 새 행이 임의 위치에 삽입되므로 인덱스 파편화를 일으킵니다. 반면 v7은 시간 순서가 앞부분에 포함돼 새 행이 끝부분에 추가되므로 자동 증가와 유사한 동작을 하면서 전역 고유성을 유지합니다.
저장 형식
- VARCHAR 로 저장하지 마세요. PostgreSQL에서는 네이티브
UUID타입(16 바이트)이나 MySQL에서는BINARY(16)으로 저장하는 것이 좋습니다.CHAR(36)혹은VARCHAR(36)로 저장하면 저장 용량이 3배 늘고 인덱스 성능이 저하됩니다.
흔히 저지르는 실수
- 대용량 테이블에 UUID v4를 사용한다는 점. 수백만 행 규모 테이블이라면 인덱스 파편화를 피하기 위해 v7이나 ULID를 사용하세요.
- 클라이언트가 생성한 UUID를 검증 없이 그대로 사용한다는 점. UUID가 올바른 형식인지 항상 검증해야 합니다. 형식이 잘못된 UUID는 파싱 오류를 일으키거나, 최악의 경우 예상치 못한 문자를 삽입할 수 있습니다.
테스트용 UUID 생성
개발 중 일회성 ID나 배치 ID 목록이 필요할 때는 SnappyTools UUID Generator를 사용하면 서버 라운드‑트립 없이 브라우저에서 v4 UUID를 바로 생성할 수 있습니다.
UUID는 전역 고유 식별자를 별도 조정 없이 확보한다는 실제 문제를 해결합니다. 안전한 기본값은 UUID v4이며, 데이터베이스 기본키에는 UUID v7이 더 나은 선택입니다. ID가 순수히 내부용이고 순차적 순서가 중요할 때는 자동 증가가 여전히 최선의 답입니다.