데이터베이스 테이블을 설계할 때 기본 키(primary key)로 1, 2, 3... 같은 자동 증가 ID를 쓰는 게 일반적이다. 하지만 서버가 여러 대이거나 데이터를 병합해야 하는 환경에서는 ID 충돌이 발생할 수 있다. 이런 상황에서 UUID를 쓰면 전 세계적으로 고유한 식별자를 만들 수 있다.
UUID의 구조
UUID(Universally Unique Identifier)는 128비트 길이의 고유 식별자다. 16진수 32자리를 하이픈으로 구분해서 표기한다.
형식550e8400-e29b-41d4-a716-446655440000
8자리-4자리-4자리-4자리-12자리, 총 36자(하이픈 포함)
v4 UUID에서 세 번째 그룹의 첫 자리는 항상 4다. 이것으로 버전을 구분한다. 네 번째 그룹의 첫 자리는 8, 9, a, b 중 하나(변형 표시)다.
UUID v4가 충돌할 확률
v4 UUID는 122비트의 무작위 값을 사용한다. 가능한 조합 수는 약 5.3 × 10³⁶개다.
- 초당 10억 개씩 생성해도 충돌이 일어나려면 수십억 년이 걸린다
- 현실적으로 충돌 확률은 무시해도 되는 수준이다
- 다만 난수 생성기의 품질이 중요하다. 암호학적 난수(CSPRNG)를 쓰지 않으면 패턴이 생길 수 있다
출력 형식 4가지
| 형식 | 예시 | 사용처 |
|---|---|---|
| 기본 (하이픈) | 550e8400-e29b-41d4-a716-446655440000 | 일반적인 DB, API |
| 하이픈 제거 | 550e8400e29b41d4a716446655440000 | URL, 파일명 |
| 중괄호 | {550e8400-e29b-...} | Windows GUID, COM |
| URN | urn:uuid:550e8400-... | XML, 표준 문서 |
UUID 생성하는 법
개발 중에 빠르게 UUID 하나가 필요하면 UUID 생성기에서 바로 뽑을 수 있다. 형식 선택, 대문자 옵션, 대량 생성(최대 1,000개)까지 지원한다. 테스트 데이터를 만들 때 1,000개를 한꺼번에 생성해서 텍스트 파일로 다운로드하면 편하다.
프로그래밍 언어별로도 생성할 수 있다.
- Python:
import uuid; uuid.uuid4() - JavaScript:
crypto.randomUUID() - Java:
UUID.randomUUID()
UUID vs 자동 증가 ID
- UUID의 장점
- 서버 간 ID 충돌 없음. 분산 시스템, 마이크로서비스에 적합. ID에서 생성 순서나 데이터 규모를 추측할 수 없어서 보안에도 유리하다.
- UUID의 단점
- 36자로 길어서 저장 공간을 더 차지한다. 정렬이 무작위라서 인덱스 성능이 떨어질 수 있다. 사람이 읽거나 외우기 어렵다.
어떤 ID 체계를 쓸지는 프로젝트 구조에 따라 다르다. 분산 환경이라면 UUID, 단일 서버에 순서가 중요하면 자동 증가 ID가 맞다.