버전 6, 7, 8 내용 보강 |
문서 최신화 |
||
1번째 줄: | 1번째 줄: | ||
== 개요 == | == 개요 == | ||
UUID(Universally Unique Identifier)는 전 세계적으로 고유한 식별자를 만들기 위해 고안된 | UUID(Universally Unique Identifier)는 전 세계적으로 고유한 식별자를 만들기 위해 고안된 128비트 표준 식별자이다. 2005년의 RFC 4122가 2024년 5월 발표된 '''RFC 9562'''로 대체되며, 최신 규격에서 버전 6 · 7 · 8이 정식 표준에 포함되었다.:contentReference[oaicite:0]{index=0} | ||
UUID는 32자리 16진수 숫자를 <code>8-4-4-4-12</code> 형식으로 하이픈으로 구분하여 표현한다. 예) <code>123e4567-e89b-12d3-a456-426614174000</code>. 버전 7은 밀리초 단위 Unix 타임스탬프를 상위 48비트에 포함해 시간 순 정렬성을 대폭 향상시켰다.:contentReference[oaicite:1]{index=1} | |||
UUID는 | |||
== 장단점 == | == 장단점 == | ||
=== 장점 === | === 장점 === | ||
* '''전 세계적 고유성''': | * '''전 세계적 고유성''': 분산 환경에서도 중복 없이 고유한 식별자를 생성할 수 있다.:contentReference[oaicite:2]{index=2} | ||
* '''충돌 가능성 낮음''': | * '''충돌 가능성 낮음''': 2<sup>122</sup> (≈5.3 × 10<sup>36</sup>)개의 조합으로 충돌 확률이 극히 낮다.:contentReference[oaicite:3]{index=3} | ||
* '''독립성''': | * '''독립성''': 중앙 서버와 통신하지 않아도 식별자를 만들 수 있다. | ||
* '''범용성''': | * '''범용성''': 대부분의 언어·플랫폼에서 기본 또는 외부 라이브러리로 지원한다.:contentReference[oaicite:4]{index=4} | ||
* '''정렬성 향상''': 버전 6·7은 시간 정보를 앞부분에 배치해 인덱스 지역성 문제를 완화한다.:contentReference[oaicite:5]{index=5} | |||
=== 단점 === | === 단점 === | ||
* '''크기''': | * '''크기''': 16바이트이므로 대규모 DB 인덱스에는 부담이 될 수 있다.:contentReference[oaicite:6]{index=6} | ||
* '''가독성''': | * '''가독성''': 사람이 읽고 기억하기엔 복잡하다. | ||
* '''정렬''': | * '''정렬''': 난수 기반인 버전 4는 생성 순서가 무작위라 B-tree 인덱스 파편화가 심하다.:contentReference[oaicite:7]{index=7} | ||
* '''보안''': | * '''보안''': 버전 1은 MAC 주소·시간 정보가 노출될 수 있다.:contentReference[oaicite:8]{index=8} | ||
== 특징 == | == 특징 == | ||
* '''고유성''': 전 세계적으로 유일하다. | |||
* 고유성''': | * '''확장성''': 네트워크 상태와 무관하게 생성 가능. | ||
* 확장성''': 네트워크 | * '''독립적 생성''': 중앙 서버 없이 분산 환경에서 사용 가능. | ||
* '''독립적 생성''': | * '''표준화''': RFC 9562로 상호 운용성 보장.:contentReference[oaicite:9]{index=9} | ||
* 표준화''': RFC | * '''다양한 버전''': 1 ~ 8 버전이 존재하며 용도별로 선택할 수 있다.:contentReference[oaicite:10]{index=10} | ||
* 다양한 버전''': | * '''풍부한 라이브러리''': Python·Go·JavaScript 등에서 모듈 또는 패키지 형태로 제공된다.:contentReference[oaicite:11]{index=11} | ||
* ''' | |||
== UUID의 버전 == | == UUID의 버전 == | ||
* '''버전 1 (타임스탬프 + MAC)''': 시간·MAC 기반, 개인 정보 노출 우려.:contentReference[oaicite:12]{index=12} | |||
* '''버전 2 (DCE 보안)''': POSIX UID/GID 포함, 실무 사용 거의 없음. | |||
* '''버전 3 (이름 기반 + MD5)''': 동일 입력에 동일 UUID 보장. | |||
* '''버전 4 (난수 기반)''': 가장 널리 쓰이며 충돌 확률 매우 낮음.:contentReference[oaicite:13]{index=13} | |||
* '''버전 5 (이름 기반 + SHA-1)''': v3과 같으나 해시 알고리즘만 SHA-1.:contentReference[oaicite:14]{index=14} | |||
* '''버전 6 (시간순 정렬 강화)''': v1의 한계를 보완해 상위비트에 big-endian 시간값 배치.:contentReference[oaicite:15]{index=15} | |||
* '''버전 7 (Unix 에포크 밀리초)''': 48비트 타임스탬프 + 74비트 난수, 인덱스 친화적.:contentReference[oaicite:16]{index=16} | |||
* '''버전 8 (사용자 정의)''': 응용 프로그램이 의미를 정의하는 커스텀 UUID.:contentReference[oaicite:17]{index=17} | |||
== | == 주요 구현 및 채택 현황 == | ||
* '''PostgreSQL''' — <code>uuid_generate_v7()</code> 함수를 제공하는 확장 <code>pg_uuidv7</code>.:contentReference[oaicite:18]{index=18} | |||
* '''Python''' — 표준 라이브러리는 v1·3·4·5만 지원하며, v7 추가 제안이 진행 중이다.:contentReference[oaicite:19]{index=19} | |||
* '''Go''' — <code>github.com/google/uuid</code> 및 <code>flexstack/uuid</code> 등이 v7을 지원한다.:contentReference[oaicite:20]{index=20} | |||
* '''Java''' — 표준 <code>java.util.UUID</code>는 v7을 아직 포함하지 않아 커뮤니티 논의가 활발하다.:contentReference[oaicite:21]{index=21} | |||
* '''DuckDB''' — 1.3.0에서 v7 지원을 추가했으나 타임스탬프 호환성 이슈가 보고되었다.:contentReference[oaicite:22]{index=22} | |||
* 기타 언어들도 외부 라이브러리 형태로 빠르게 v7을 채택 중이다.:contentReference[oaicite:23]{index=23} | |||
UUID | |||
* | |||
== 충돌 확률 == | == 충돌 확률 == | ||
버전 4·6·7·8 모두 122비트 이상의 무작위 엔트로피를 갖는다. 초당 10억 개의 UUID를 100년간 생성해도 50% 충돌 확률에 도달하지 않는다.:contentReference[oaicite:24]{index=24} | |||
== 결론 == | == 결론 == | ||
UUID는 | UUID는 여전히 분산 시스템에서 사실상 표준 식별자이며, RFC 9562 채택으로 버전 6·7·8이 공식화되어 정렬성과 활용성이 크게 개선되었다. 각 상황에 맞는 버전을 선택해 사용하면, 충돌 위험을 최소화하면서도 성능·보안·정렬성 요구 사항을 충족할 수 있다. | ||
2025년 5월 23일 (금) 14:26 판
개요
UUID(Universally Unique Identifier)는 전 세계적으로 고유한 식별자를 만들기 위해 고안된 128비트 표준 식별자이다. 2005년의 RFC 4122가 2024년 5월 발표된 RFC 9562로 대체되며, 최신 규격에서 버전 6 · 7 · 8이 정식 표준에 포함되었다.:contentReference[oaicite:0]{index=0}
UUID는 32자리 16진수 숫자를 8-4-4-4-12
형식으로 하이픈으로 구분하여 표현한다. 예) 123e4567-e89b-12d3-a456-426614174000
. 버전 7은 밀리초 단위 Unix 타임스탬프를 상위 48비트에 포함해 시간 순 정렬성을 대폭 향상시켰다.:contentReference[oaicite:1]{index=1}
장단점
장점
- 전 세계적 고유성: 분산 환경에서도 중복 없이 고유한 식별자를 생성할 수 있다.:contentReference[oaicite:2]{index=2}
- 충돌 가능성 낮음: 2122 (≈5.3 × 1036)개의 조합으로 충돌 확률이 극히 낮다.:contentReference[oaicite:3]{index=3}
- 독립성: 중앙 서버와 통신하지 않아도 식별자를 만들 수 있다.
- 범용성: 대부분의 언어·플랫폼에서 기본 또는 외부 라이브러리로 지원한다.:contentReference[oaicite:4]{index=4}
- 정렬성 향상: 버전 6·7은 시간 정보를 앞부분에 배치해 인덱스 지역성 문제를 완화한다.:contentReference[oaicite:5]{index=5}
단점
- 크기: 16바이트이므로 대규모 DB 인덱스에는 부담이 될 수 있다.:contentReference[oaicite:6]{index=6}
- 가독성: 사람이 읽고 기억하기엔 복잡하다.
- 정렬: 난수 기반인 버전 4는 생성 순서가 무작위라 B-tree 인덱스 파편화가 심하다.:contentReference[oaicite:7]{index=7}
- 보안: 버전 1은 MAC 주소·시간 정보가 노출될 수 있다.:contentReference[oaicite:8]{index=8}
특징
- 고유성: 전 세계적으로 유일하다.
- 확장성: 네트워크 상태와 무관하게 생성 가능.
- 독립적 생성: 중앙 서버 없이 분산 환경에서 사용 가능.
- 표준화: RFC 9562로 상호 운용성 보장.:contentReference[oaicite:9]{index=9}
- 다양한 버전: 1 ~ 8 버전이 존재하며 용도별로 선택할 수 있다.:contentReference[oaicite:10]{index=10}
- 풍부한 라이브러리: Python·Go·JavaScript 등에서 모듈 또는 패키지 형태로 제공된다.:contentReference[oaicite:11]{index=11}
UUID의 버전
- 버전 1 (타임스탬프 + MAC): 시간·MAC 기반, 개인 정보 노출 우려.:contentReference[oaicite:12]{index=12}
- 버전 2 (DCE 보안): POSIX UID/GID 포함, 실무 사용 거의 없음.
- 버전 3 (이름 기반 + MD5): 동일 입력에 동일 UUID 보장.
- 버전 4 (난수 기반): 가장 널리 쓰이며 충돌 확률 매우 낮음.:contentReference[oaicite:13]{index=13}
- 버전 5 (이름 기반 + SHA-1): v3과 같으나 해시 알고리즘만 SHA-1.:contentReference[oaicite:14]{index=14}
- 버전 6 (시간순 정렬 강화): v1의 한계를 보완해 상위비트에 big-endian 시간값 배치.:contentReference[oaicite:15]{index=15}
- 버전 7 (Unix 에포크 밀리초): 48비트 타임스탬프 + 74비트 난수, 인덱스 친화적.:contentReference[oaicite:16]{index=16}
- 버전 8 (사용자 정의): 응용 프로그램이 의미를 정의하는 커스텀 UUID.:contentReference[oaicite:17]{index=17}
주요 구현 및 채택 현황
- PostgreSQL —
uuid_generate_v7()
함수를 제공하는 확장pg_uuidv7
.:contentReference[oaicite:18]{index=18} - Python — 표준 라이브러리는 v1·3·4·5만 지원하며, v7 추가 제안이 진행 중이다.:contentReference[oaicite:19]{index=19}
- Go —
github.com/google/uuid
및flexstack/uuid
등이 v7을 지원한다.:contentReference[oaicite:20]{index=20} - Java — 표준
java.util.UUID
는 v7을 아직 포함하지 않아 커뮤니티 논의가 활발하다.:contentReference[oaicite:21]{index=21} - DuckDB — 1.3.0에서 v7 지원을 추가했으나 타임스탬프 호환성 이슈가 보고되었다.:contentReference[oaicite:22]{index=22}
- 기타 언어들도 외부 라이브러리 형태로 빠르게 v7을 채택 중이다.:contentReference[oaicite:23]{index=23}
충돌 확률
버전 4·6·7·8 모두 122비트 이상의 무작위 엔트로피를 갖는다. 초당 10억 개의 UUID를 100년간 생성해도 50% 충돌 확률에 도달하지 않는다.:contentReference[oaicite:24]{index=24}
결론
UUID는 여전히 분산 시스템에서 사실상 표준 식별자이며, RFC 9562 채택으로 버전 6·7·8이 공식화되어 정렬성과 활용성이 크게 개선되었다. 각 상황에 맞는 버전을 선택해 사용하면, 충돌 위험을 최소화하면서도 성능·보안·정렬성 요구 사항을 충족할 수 있다.