범용 고유 식별자: 두 판 사이의 차이

Gaon12 (토론 / 기여)
문서 최신화
Gaon12 (토론 / 기여)
PostgreSQL 18/Python 3.14/.NET 9 지원 추가, PHP 구현 방법 신규 작성, 업계 채택 동향 업데이트
 
(같은 사용자의 중간 판 2개는 보이지 않습니다)
1번째 줄: 1번째 줄:
== 개요 ==
== 개요 ==
UUID(Universally Unique Identifier)는 전 세계적으로 고유한 식별자를 만들기 위해 고안된 128비트 표준 식별자이다. 2005년의 RFC 4122가 2024년 5월 발표된 '''RFC 9562'''로 대체되며, 최신 규격에서 버전 6 · 7 · 8이 정식 표준에 포함되었다.:contentReference[oaicite:0]{index=0} 
'''UUID'''(Universally Unique Identifier)는 전 세계적으로 고유한 식별자를 만들기 위해 고안된 '''128비트''' 표준 식별자이다. '''GUID'''(Globally Unique Identifier)라고도 불린다.
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}
 
2024년 5월 7일, RFC 9562가 발표되어 3개의 새로운 "버전"이 도입되고 일부 모호함이 명확해졌다. 2005년의 RFC 4122를 대체하는 최신 규격으로, 새로운 버전 6, 7, 8이 정식 표준에 포함되었다.
 
UUID는 32자리 16진수 숫자를 <code>8-4-4-4-12</code> 형식으로 하이픈으로 구분하여 표현한다.
<pre>
예시: 123e4567-e89b-12d3-a456-426614174000
</pre>
 
버전 7 UUID(UUIDv7)는 고부하 데이터베이스와 분산 시스템의 키를 위해 설계되었으며, 48비트 빅엔디안 Unix Epoch 타임스탬프로 시작하여 대략 밀리초 단위의 정밀도를 제공한다.
 
== 역사 ==
* '''1987년''': 아폴로 네트워크 컴퓨팅 시스템(NCS)에서 최초 개념 등장
* '''1990년대''': OSF DCE(Open Software Foundation Distributed Computing Environment)에서 표준화 시작
* '''2005년''': RFC 4122로 공식 표준화
* '''2024년 5월 7일''': RFC 9562로 대체, 버전 6·7·8 추가
* '''2024년 11월''': .NET 9에서 Guid.CreateVersion7() 정식 출시
* '''2025년 5월''': PostgreSQL 18 베타에서 uuidv7() 함수 추가
* '''2025년 중''': Python 3.14에서 UUID v6, v7, v8 공식 지원
 
== 구조 ==
UUID는 총 '''128비트'''(16바이트)로 구성되며, 다음과 같은 필드로 나뉜다:
 
<pre>
xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx
</pre>
 
* '''M''': 버전 정보 (4비트)
* '''N''': 변형(variant) 정보 (2~3비트)
* '''나머지''': 버전별로 다른 데이터
 
== 버전별 상세 ==
=== 버전 1 (타임스탬프 + MAC 주소) ===
* '''구성''': 60비트 타임스탬프 + 14비트 클록 시퀀스 + 48비트 MAC 주소
* '''장점''': 시간 순서 보장, 높은 고유성
* '''단점''': MAC 주소 노출로 인한 개인정보 이슈
* '''사용 사례''': 마이크로소프트 COM, 일부 데이터베이스 시스템
 
=== 버전 2 (DCE 보안) ===
* '''구성''': 버전 1 + POSIX UID/GID
* '''특징''': 실무에서 거의 사용되지 않음
* '''용도''': DCE(Distributed Computing Environment) 보안 컨텍스트
 
=== 버전 3 (이름 기반 + MD5) ===
* '''구성''': 네임스페이스 UUID + 이름을 MD5 해시
* '''특징''': 동일한 입력에 동일한 UUID 생성 (결정적)
* '''단점''': MD5의 보안 취약점
* '''사용 사례''': DNS 이름, URL 기반 식별자
 
=== 버전 4 (난수 기반) ===
* '''구성''': 122비트 의사난수
* '''장점''': 가장 간단하고 널리 사용됨
* '''단점''': 완전 무작위라 정렬 불가, B-tree 인덱스 파편화 심각
* '''사용 사례''': 웹 애플리케이션, API 키, 세션 ID
 
=== 버전 5 (이름 기반 + SHA-1) ===
* '''구성''': 네임스페이스 UUID + 이름을 SHA-1 해시
* '''특징''': 버전 3의 개선판, MD5 대신 SHA-1 사용
* '''용도''': 보안이 중요한 이름 기반 식별자
 
=== 버전 6 (시간순 정렬 강화) ===
* '''구성''': 버전 1의 타임스탬프를 big-endian으로 재배치
* '''장점''': 시간 순 정렬 가능, MAC 주소 포함
* '''단점''': 여전한 개인정보 노출 위험
* '''개선점''': 버전 1의 정렬 문제 해결
 
=== 버전 7 (Unix 에포크 밀리초) ===
* '''구성''': 48비트 Unix 타임스탬프(밀리초) + 74비트 난수
* '''장점''':
** 시간 순 정렬 완벽 지원
** 개인정보 노출 없음
** 데이터베이스 인덱스 친화적
* '''특징''': '''2025년 현재 가장 권장되는 버전'''
* 버전 7은 시간순 정렬이 바람직할 때 좋은 대안으로, 무작위성과 정렬 가능성 사이의 좋은 균형을 제공한다.
* 밀리초 내 모노토닉 증가를 보장하는 구현 방식은 플랫폼마다 다를 수 있음
 
=== 버전 8 (사용자 정의) ===
* '''구성''': 애플리케이션이 자유롭게 정의
* '''용도''': 특수한 요구사항이 있는 커스텀 구현
* '''주의''': 표준 호환성은 보장되지 않음


== 장단점 ==
== 장단점 ==
=== 장점 ===
=== 장점 ===
* '''전 세계적 고유성''': 분산 환경에서도 중복 없이 고유한 식별자를 생성할 수 있다.:contentReference[oaicite:2]{index=2}
* '''전 세계적 고유성''': 분산 환경에서도 중복 없이 고유한 식별자 생성 가능
* '''충돌 가능성 낮음''': 2<sup>122</sup> (≈5.3 × 10<sup>36</sup>)개의 조합으로 충돌 확률이 극히 낮다.:contentReference[oaicite:3]{index=3}
* '''충돌 가능성 극히 낮음''': 2<sup>122</sup> (≈5.3 × 10<sup>36</sup>)개의 조합
* '''독립성''': 중앙 서버와 통신하지 않아도 식별자를 만들 수 있다.
* '''독립성''': 중앙 서버 없이도 생성 가능
* '''범용성''': 대부분의 언어·플랫폼에서 기본 또는 외부 라이브러리로 지원한다.:contentReference[oaicite:4]{index=4}
* '''범용성''': 대부분의 프로그래밍 언어와 플랫폼에서 지원
* '''정렬성 향상''': 버전 6·7은 시간 정보를 앞부분에 배치해 인덱스 지역성 문제를 완화한다.:contentReference[oaicite:5]{index=5}
* '''표준화''': RFC 표준으로 상호 운용성 보장


=== 단점 ===
=== 단점 ===
* '''크기''': 16바이트이므로 대규모 DB 인덱스에는 부담이 될 수 있다.:contentReference[oaicite:6]{index=6}
* '''크기''': 16바이트로 대규모 데이터베이스에서는 부담
* '''가독성''': 사람이 읽고 기억하기엔 복잡하다.
* '''가독성''': 사람이 읽고 기억하기 어려움
* '''정렬''': 난수 기반인 버전 4는 생성 순서가 무작위라 B-tree 인덱스 파편화가 심하다.:contentReference[oaicite:7]{index=7}
* '''정렬 문제''': 버전 4는 무작위 생성으로 인덱스 파편화 심각
* '''보안''': 버전 1은 MAC 주소·시간 정보가 노출될 수 있다.:contentReference[oaicite:8]{index=8}
* '''보안 이슈''': 버전 1, 6은 MAC 주소 노출 위험
 
== 충돌 확률 ==
UUID의 충돌 확률은 '''천문학적으로 낮다'''.


== 특징 ==
* '''이론적 계산''': 초당 10억 개의 UUID를 100년간 생성해도 50% 충돌 확률에 도달하지 않음
* '''고유성''': 전 세계적으로 유일하다.
* '''실제 사례''': 지금까지 공개된 UUID 충돌 사례는 '''0건'''
* '''확장성''': 네트워크 상태와 무관하게 생성 가능.
* '''비교''': 로또 1등 당첨(약 10<sup>-8</sup>)보다 10<sup>28</sup>배 더 낮은 확률
* '''독립적 생성''': 중앙 서버 없이 분산 환경에서 사용 가능.
* '''표준화''': 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 포함, 실무 사용 거의 없음.
* '''PostgreSQL 18''' (2025년 9월 정식 출시 예정): <code>uuidv7()</code> 함수 네이티브 지원
* '''버전 3 (이름 기반 + MD5)''': 동일 입력에 동일 UUID 보장.
** rand_a 부분을 서브밀리초 타임스탬프로 활용하여 초당 약 400만 개 UUID 생성 처리 가능
* '''버전 4 (난수 기반)''': 가장 널리 쓰이며 충돌 확률 매우 낮음.:contentReference[oaicite:13]{index=13}
** 단일 프로세스 내에서 모노토닉 증가 보장
* '''버전 5 (이름 기반 + SHA-1)''': v3과 같으나 해시 알고리즘만 SHA-1.:contentReference[oaicite:14]{index=14}
** <code>uuid_extract_timestamp()</code>, <code>uuid_extract_version()</code> 함수도 UUIDv7 지원
* '''버전 6 (시간순 정렬 강화)''': v1의 한계를 보완해 상위비트에 big-endian 시간값 배치.:contentReference[oaicite:15]{index=15}
* '''MariaDB 11.7''': <code>UUID_v7()</code> 함수 제공
* '''버전 7 (Unix 에포크 밀리초)''': 48비트 타임스탬프 + 74비트 난수, 인덱스 친화적.:contentReference[oaicite:16]{index=16}
* '''MySQL''': 공식 네이티브 지원 없음 (커뮤니티 컴포넌트/플러그인으로 가능)
* '''버전 8 (사용자 정의)''': 응용 프로그램이 의미를 정의하는 커스텀 UUID.:contentReference[oaicite:17]{index=17}
** <code>UUID()</code> 함수는 버전 1만 지원
** <code>UUID_TO_BIN()</code>의 swap flag로 타임스탬프 재배치 가능
* '''SQLite''': <code>hex(randomblob(16))</code> 형태로 구현
* '''DuckDB''': 1.3.0에서 v7 지원 추가


== 주요 구현 및 채택 현황 ==
=== 프로그래밍 언어 ===
* '''PostgreSQL''' — <code>uuid_generate_v7()</code> 함수를 제공하는 확장 <code>pg_uuidv7</code>.:contentReference[oaicite:18]{index=18}
==== Python ====
* '''Python''' — 표준 라이브러리는 v1·3·4·5만 지원하며, v7 추가 제안이 진행 중이다.:contentReference[oaicite:19]{index=19}
Python 3.14에서 UUID 버전 6, 7, 8이 표준 라이브러리에 공식 추가되었다.
* '''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}


== 충돌 확률 ==
<syntaxhighlight lang="python">
버전 4·6·7·8 모두 122비트 이상의 무작위 엔트로피를 갖는다. 초당 10억 개의 UUID를 100년간 생성해도 50% 충돌 확률에 도달하지 않는다.:contentReference[oaicite:24]{index=24}
import uuid
 
# 버전 4 (가장 일반적)
uuid4 = uuid.uuid4()
 
# 버전 1
uuid1 = uuid.uuid1()
 
# 버전 7 (Python 3.14+)
uuid7 = uuid.uuid7()
 
# 버전 8 (Python 3.14+)
uuid8 = uuid.uuid8()
 
# Python 3.13 이하에서는 외부 라이브러리 사용
# pip install uuid-utils 또는 uuid-extension
</syntaxhighlight>
 
==== JavaScript/Node.js ====
<syntaxhighlight lang="javascript">
// crypto 모듈 사용 (버전 4만 지원)
const { randomUUID } = require('crypto');
const uuid = randomUUID();
 
// uuid 패키지 사용 (모든 버전 지원)
const { v4: uuidv4, v7: uuidv7 } = require('uuid');
const id4 = uuidv4();
const id7 = uuidv7();
</syntaxhighlight>
 
==== Java ====
Java OpenJDK에서 RFC 9562에 정의된 UUID 버전 7(UUIDv7) 지원 추가를 위한 작업이 진행 중이다(JDK-8334015). 현재는 외부 라이브러리를 통해 사용 가능하다.
 
<syntaxhighlight lang="java">
// 표준 라이브러리 (버전 4만 지원)
UUID uuid = UUID.randomUUID();
 
// 버전 7은 외부 라이브러리 필요
// uuid-creator 라이브러리 사용 예시
import com.github.f4b6a3.uuid.UuidCreator;
 
UUID uuid7 = UuidCreator.getTimeOrderedEpoch();
</syntaxhighlight>
 
==== .NET/C# ====
.NET 9 (2024년 11월 정식 출시)에서 <code>Guid.CreateVersion7()</code> 메서드가 추가되어 네이티브로 UUID v7을 지원한다.
 
<syntaxhighlight lang="csharp">
// .NET 9.0 이상
var guid = Guid.CreateVersion7();
 
// 특정 타임스탬프로 생성
var guidWithTimestamp = Guid.CreateVersion7(DateTimeOffset.UtcNow);
 
// TimeProvider를 활용한 테스트 가능한 코드
var uuid = Guid.CreateVersion7(timeProvider.GetUtcNow());
 
// GUID 버전 확인
var version = guid.Version; // 7
 
// .NET 8 이하에서는 외부 라이브러리 필요
</syntaxhighlight>
 
==== Go ====
<syntaxhighlight lang="go">
// google/uuid 패키지
import "github.com/google/uuid"
 
// 버전 4
uuid := uuid.New()
 
// 버전 7 (v1.6.0+)
uuid7, err := uuid.NewV7()
</syntaxhighlight>
 
==== PHP ====
PHP에서는 네이티브 UUID 지원이 제한적이므로 라이브러리를 사용하거나 직접 구현하는 방식을 사용한다.
 
'''라이브러리 사용 (ramsey/uuid)'''
 
ramsey/uuid는 가장 널리 사용되는 PHP UUID 라이브러리로, RFC 9562의 모든 버전(1-8)을 지원한다.
 
<syntaxhighlight lang="php">
<?php
// Composer로 설치
// composer require ramsey/uuid
 
use Ramsey\Uuid\Uuid;
 
// 버전 4 (무작위)
$uuid4 = Uuid::uuid4();
echo $uuid4->toString(); // e.g. 25769c6c-d34d-4bfe-ba98-e0ee856f3e7a
 
// 버전 7 (시간순 정렬)
$uuid7 = Uuid::uuid7();
echo $uuid7->toString(); // e.g. 01921e85-f198-7490-9b89-7dd0d468543b
 
// 날짜/시간 정보 추출
printf("UUID: %s\n", $uuid7->toString());
printf("Version: %d\n", $uuid7->getFields()->getVersion());
printf("Date: %s\n", $uuid7->getDateTime()->format('Y-m-d H:i:s'));
 
// 특정 날짜로 버전 7 생성
$dateTime = new DateTimeImmutable('2025-01-01 00:00:00');
$uuid7WithDate = Uuid::uuid7($dateTime);
 
// 버전 1, 3, 5, 6, 8도 지원
$uuid1 = Uuid::uuid1();
$uuid5 = Uuid::uuid5(Uuid::NAMESPACE_DNS, 'example.com');
$uuid6 = Uuid::uuid6();
</syntaxhighlight>
 
'''직접 구현 (버전 4)'''
 
외부 라이브러리 없이 간단한 UUID v4를 직접 구현할 수 있다.
 
<syntaxhighlight lang="php">
<?php
function uuid4(): string
{
    // PHP 7.0+ 필요
    $data = random_bytes(16);
   
    // 버전 비트 설정 (0100)
    $data[6] = chr(ord($data[6]) & 0x0f | 0x40);
   
    // 변형 비트 설정 (10xx)
    $data[8] = chr(ord($data[8]) & 0x3f | 0x80);
   
    // UUID 문자열 포맷
    return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4));
}
 
echo uuid4(); // e.g. 550e8400-e29b-41d4-a716-446655440000
</syntaxhighlight>
 
'''직접 구현 (버전 7)'''
 
UUID v7도 비교적 간단하게 직접 구현 가능하다.
 
<syntaxhighlight lang="php">
<?php
function uuid7(): string
{
    static $last_timestamp = 0;
   
    // 현재 타임스탬프 (밀리초)
    $unixts_ms = intval(microtime(true) * 1000);
   
    // 모노토닉 증가 보장
    if ($last_timestamp >= $unixts_ms) {
        $unixts_ms = $last_timestamp + 1;
    }
    $last_timestamp = $unixts_ms;
   
    // 10바이트 랜덤 데이터 생성
    $data = random_bytes(10);
   
    // 버전 비트 설정 (0111)
    $data[0] = chr((ord($data[0]) & 0x0f) | 0x70);
   
    // 변형 비트 설정 (10xx)
    $data[2] = chr((ord($data[2]) & 0x3f) | 0x80);
   
    // 타임스탬프 + 랜덤 데이터 결합
    return vsprintf(
        '%s%s-%s-%s-%s-%s%s%s',
        str_split(
            str_pad(dechex($unixts_ms), 12, '0', STR_PAD_LEFT) . bin2hex($data),
            4
        )
    );
}
 
echo uuid7(); // e.g. 01921e85-f198-7490-9b89-7dd0d468543b
</syntaxhighlight>
 
'''Laravel에서 사용'''
 
Laravel 11+에서는 Eloquent 모델에서 UUID를 쉽게 사용할 수 있다.
 
<syntaxhighlight lang="php">
<?php
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Concerns\HasUuids;
use Illuminate\Database\Eloquent\Concerns\HasVersion7Uuids;
 
// 버전 4 UUID (기본)
class Product extends Model
{
    use HasUuids;
   
    // 자동으로 'id' 필드에 UUID v4 생성
}
 
// 버전 7 UUID (권장)
class Order extends Model
{
    use HasVersion7Uuids;
   
    // 자동으로 'id' 필드에 UUID v7 생성
    // 시간순 정렬 가능하여 데이터베이스 성능 향상
}
 
// 직접 생성
use Illuminate\Support\Str;
 
$uuid4 = Str::uuid();          // 버전 4
$uuid7 = Str::orderedUuid();    // 시간순 UUID (버전 4 기반)
</syntaxhighlight>
 
'''Doctrine ORM 통합'''
 
<syntaxhighlight lang="php">
<?php
use Doctrine\ORM\Mapping as ORM;
use Ramsey\Uuid\Doctrine\UuidV7Generator;
use Ramsey\Uuid\UuidInterface;
 
#[ORM\Entity]
#[ORM\Table(name: 'products')]
class Product
{
    #[ORM\Id]
    #[ORM\Column(type: 'uuid_binary', unique: true)]
    #[ORM\GeneratedValue(strategy: 'CUSTOM')]
    #[ORM\CustomIdGenerator(class: UuidV7Generator::class)]
    private UuidInterface $id;
   
    public function getId(): UuidInterface
    {
        return $this->id;
    }
}
</syntaxhighlight>
 
'''경량 대안 라이브러리'''
 
대규모 의존성이 부담스러운 경우 경량 라이브러리 사용을 고려할 수 있다.
 
<syntaxhighlight lang="php">
<?php
// oittaa/uuid-php (경량 라이브러리)
// composer require oittaa/uuid-php
 
use UUID\UUID;
 
$uuid4 = UUID::uuid4();
$uuid7 = UUID::uuid7();
$uuid8 = UUID::uuid8();
 
// 검증
$isValid = UUID::isValid('01921e85-f198-7490-9b89-7dd0d468543b');
</syntaxhighlight>
 
=== 다중 언어 구현 ===
JavaScript에서 Zig까지, 제3자 종속성 없이 33개 언어로 구현된 UUIDv7이 있다.
 
=== 주요 서비스 채택 ===
* '''GitHub''': API 리소스 식별자
* '''Discord''': 스노우플레이크 ID (UUID 유사 구조)
* '''MongoDB''': ObjectId (UUID와 유사한 12바이트 식별자)
* '''AWS''': 다양한 리소스 식별자
* '''Microsoft''': COM, .NET GUID
 
== 성능 고려사항 ==
=== 데이터베이스 인덱스 ===
{| class="wikitable"
! 버전 !! 인덱스 성능 !! 비고
|-
| 버전 4 || 나쁨 || B-tree 인덱스 파편화 심각, 랜덤 삽입으로 페이지 분할 빈번
|-
| 버전 7 || 우수 || 시간 순 정렬로 인덱스 성능 향상, 순차 삽입으로 페이지 분할 최소화
|-
| 버전 1, 6 || 보통 || 일부 정렬 가능하나 개인정보 노출
|}
 
=== 저장 공간 ===
* '''UUID (바이너리)''': 16바이트 (128비트)
* '''UUID (문자열)''': 36바이트 (하이픈 포함)
* '''정수 ID''': 4~8바이트
* '''성능 팁''': 데이터베이스에서는 바이너리로 저장하고 필요시 문자열로 변환
 
== 보안 고려사항 ==
=== 예측 가능성 ===
* '''버전 1, 6''': MAC 주소와 시간 정보로 일부 예측 가능
* '''버전 4, 7''': 난수 기반으로 예측 불가능
* '''버전 3, 5''': 입력이 같으면 결과가 동일 (의도된 동작)
 
=== 정보 노출 위험 ===
* '''MAC 주소''': 버전 1, 6에서 하드웨어 정보 노출
* '''타임스탬프''': 버전 1, 6, 7에서 생성 시간 추정 가능
* '''권장사항''': 공개적으로 사용할 경우 버전 4나 7 사용, 보안에 민감한 경우 버전 4 선호
 
=== 모노토닉 증가 이슈 ===
* .NET 9의 <code>Guid.CreateVersion7()</code>는 밀리초 내 모노토닉 증가를 보장하지 않음 (순수 랜덤)
* PostgreSQL 18의 <code>uuidv7()</code>는 단일 프로세스 내에서 모노토닉 증가 보장
* 배치 처리나 트랜잭션에서 엄격한 순서가 필요한 경우 ULID 같은 대안 고려
 
== 실무 사용 패턴 ==
=== 언제 UUID를 사용할까? ===
'''사용하면 좋은 경우'''
* 분산 시스템에서 고유 식별자 필요
* 마이크로서비스 간 데이터 교환
* API 리소스 식별자
* 세션 ID, 토큰
* 파일명, 임시 디렉토리명
* 다중 데이터베이스 환경에서의 병합
 
'''사용하지 않는 것이 좋은 경우'''
* 순차적 번호가 필요한 경우 (주문번호 등)
* 사용자가 직접 입력해야 하는 경우
* 메모리/저장공간이 매우 제한적인 환경
* 초고성능이 필요한 정수 연산
* 단일 서버 환경에서 AUTO_INCREMENT로 충분한 경우
 
=== 버전 선택 가이드 ===
{| class="wikitable"
! 용도 !! 권장 버전 !! 이유
|-
| 일반적인 식별자 || '''v4''' || 간단하고 안전, 예측 불가능
|-
| 데이터베이스 PK || '''v7''' || 인덱스 성능 우수, 시간순 정렬
|-
| 시간 순서 중요 || '''v7''' || 밀리초 단위 정렬, 삽입 성능 우수
|-
| 결정적 생성 || '''v5''' || 같은 입력 → 같은 결과
|-
| 레거시 호환 || '''v1''' || 기존 시스템과의 호환성
|-
| 보안 토큰 || '''v4''' || 완전 무작위, 예측 불가
|}
 
== 최신 동향 및 발전 방향 ==
=== RFC 9562의 주요 변화 ===
* '''새로운 버전 추가''': 버전 6, 7, 8의 정식 표준화
* '''명확화''': 기존 사양의 모호한 부분들 정리
* '''현대적 요구사항 반영''': 대용량 데이터베이스와 분산 시스템에 최적화
 
=== 2024-2025년 업계 채택 동향 ===
* '''데이터베이스 엔진''':
** PostgreSQL 18에서 uuidv7() 네이티브 지원 (2025년 5월 베타, 9월 정식 출시 예정)
** MariaDB 11.7에서 UUID_v7() 함수 추가
** MySQL은 아직 공식 지원 없음 (커뮤니티 확장으로 가능)
* '''프로그래밍 언어''':
** .NET 9에서 Guid.CreateVersion7() 네이티브 지원 (2024년 11월 출시)
** Python 3.14에서 uuid.uuid7() 표준 라이브러리 추가 (2025년)
** Java OpenJDK에서 UUID.epochMillis() 구현 진행 중 (JDK-8334015)
* '''라이브러리 생태계''': 다양한 언어에서 제3자 라이브러리 형태로 빠른 채택
* '''산업 트렌드''': 버전 4에서 버전 7로의 점진적 마이그레이션 추세
 
=== 향후 전망 ===
* 주요 데이터베이스 엔진의 UUID v7 표준 지원 확대
* ORM 및 프레임워크의 네이티브 UUID v7 지원
* 레거시 시스템에서 UUID v4 → v7 마이그레이션 증가
* 클라우드 네이티브 애플리케이션에서 UUID v7이 사실상의 표준으로 자리잡을 전망
 
== 트리비아 ==
* UUID의 '''nil UUID'''는 모든 비트가 0인 <code>00000000-0000-0000-0000-000000000000</code>이다
* 브라켓 표기법도 존재한다: <code>{123e4567-e89b-12d3-a456-426614174000}</code>
* Microsoft는 UUID를 '''GUID'''(Globally Unique Identifier)라고 부른다
* PostgreSQL에서 UUID는 native 타입으로 지원되어 저장 공간을 절약할 수 있다
* 버전 7의 등장으로 '''Twitter의 Snowflake ID'''와 유사한 기능을 표준으로 사용할 수 있게 되었다
* .NET의 Guid와 SQL Server의 uniqueidentifier는 바이트 순서가 다르므로 변환 시 주의 필요
* Python 3.14의 uuid7() 구현은 42비트 카운터를 사용하여 밀리초 내 모노토닉 증가 보장
 
== 같이 보기 ==
* [[RFC]]
* [[해시 함수]]
* [[데이터베이스]]
* [[분산 시스템]]
* [[API]]
* [[식별자]]
* [[ULID]]
* [[Snowflake ID]]
 
== 각주 ==
<references />
 
== 외부 링크 ==
* [https://datatracker.ietf.org/doc/html/rfc9562 RFC 9562 - Universally Unique IDentifiers (UUIDs)]
* [https://www.uuidgenerator.net/ UUID Generator Online]
* [https://uuid6.github.io/uuid6-ietf-draft/ New UUID Formats]
* [https://antonz.org/uuidv7/ UUIDv7 in 33 languages]
* [https://www.postgresql.org/about/news/postgresql-18-beta-1-released-2913/ PostgreSQL 18 Beta Release]
* [https://learn.microsoft.com/en-us/dotnet/api/system.guid.createversion7 .NET Guid.CreateVersion7 Documentation]
* [https://docs.python.org/3.14/library/uuid.html Python 3.14 UUID Documentation]


== 결론 ==
[[분류:식별자]]
UUID는 여전히 분산 시스템에서 사실상 표준 식별자이며, RFC 9562 채택으로 버전 6·7·8이 공식화되어 정렬성과 활용성이 크게 개선되었다. 각 상황에 맞는 버전을 선택해 사용하면, 충돌 위험을 최소화하면서도 성능·보안·정렬성 요구 사항을 충족할 수 있다.
[[분류:컴퓨터 과학]]
[[분류:데이터베이스]]
[[분류:인터넷 표준]]

2025년 10월 9일 (목) 14:11 기준 최신판

개요[편집 / 원본 편집]

UUID(Universally Unique Identifier)는 전 세계적으로 고유한 식별자를 만들기 위해 고안된 128비트 표준 식별자이다. GUID(Globally Unique Identifier)라고도 불린다.

2024년 5월 7일, RFC 9562가 발표되어 3개의 새로운 "버전"이 도입되고 일부 모호함이 명확해졌다. 2005년의 RFC 4122를 대체하는 최신 규격으로, 새로운 버전 6, 7, 8이 정식 표준에 포함되었다.

UUID는 32자리 16진수 숫자를 8-4-4-4-12 형식으로 하이픈으로 구분하여 표현한다.

예시: 123e4567-e89b-12d3-a456-426614174000

버전 7 UUID(UUIDv7)는 고부하 데이터베이스와 분산 시스템의 키를 위해 설계되었으며, 48비트 빅엔디안 Unix Epoch 타임스탬프로 시작하여 대략 밀리초 단위의 정밀도를 제공한다.

역사[편집 / 원본 편집]

  • 1987년: 아폴로 네트워크 컴퓨팅 시스템(NCS)에서 최초 개념 등장
  • 1990년대: OSF DCE(Open Software Foundation Distributed Computing Environment)에서 표준화 시작
  • 2005년: RFC 4122로 공식 표준화
  • 2024년 5월 7일: RFC 9562로 대체, 버전 6·7·8 추가
  • 2024년 11월: .NET 9에서 Guid.CreateVersion7() 정식 출시
  • 2025년 5월: PostgreSQL 18 베타에서 uuidv7() 함수 추가
  • 2025년 중: Python 3.14에서 UUID v6, v7, v8 공식 지원

구조[편집 / 원본 편집]

UUID는 총 128비트(16바이트)로 구성되며, 다음과 같은 필드로 나뉜다:

xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx
  • M: 버전 정보 (4비트)
  • N: 변형(variant) 정보 (2~3비트)
  • 나머지: 버전별로 다른 데이터

버전별 상세[편집 / 원본 편집]

버전 1 (타임스탬프 + MAC 주소)[편집 / 원본 편집]

  • 구성: 60비트 타임스탬프 + 14비트 클록 시퀀스 + 48비트 MAC 주소
  • 장점: 시간 순서 보장, 높은 고유성
  • 단점: MAC 주소 노출로 인한 개인정보 이슈
  • 사용 사례: 마이크로소프트 COM, 일부 데이터베이스 시스템

버전 2 (DCE 보안)[편집 / 원본 편집]

  • 구성: 버전 1 + POSIX UID/GID
  • 특징: 실무에서 거의 사용되지 않음
  • 용도: DCE(Distributed Computing Environment) 보안 컨텍스트

버전 3 (이름 기반 + MD5)[편집 / 원본 편집]

  • 구성: 네임스페이스 UUID + 이름을 MD5 해시
  • 특징: 동일한 입력에 동일한 UUID 생성 (결정적)
  • 단점: MD5의 보안 취약점
  • 사용 사례: DNS 이름, URL 기반 식별자

버전 4 (난수 기반)[편집 / 원본 편집]

  • 구성: 122비트 의사난수
  • 장점: 가장 간단하고 널리 사용됨
  • 단점: 완전 무작위라 정렬 불가, B-tree 인덱스 파편화 심각
  • 사용 사례: 웹 애플리케이션, API 키, 세션 ID

버전 5 (이름 기반 + SHA-1)[편집 / 원본 편집]

  • 구성: 네임스페이스 UUID + 이름을 SHA-1 해시
  • 특징: 버전 3의 개선판, MD5 대신 SHA-1 사용
  • 용도: 보안이 중요한 이름 기반 식별자

버전 6 (시간순 정렬 강화)[편집 / 원본 편집]

  • 구성: 버전 1의 타임스탬프를 big-endian으로 재배치
  • 장점: 시간 순 정렬 가능, MAC 주소 포함
  • 단점: 여전한 개인정보 노출 위험
  • 개선점: 버전 1의 정렬 문제 해결

버전 7 (Unix 에포크 밀리초)[편집 / 원본 편집]

  • 구성: 48비트 Unix 타임스탬프(밀리초) + 74비트 난수
  • 장점:
    • 시간 순 정렬 완벽 지원
    • 개인정보 노출 없음
    • 데이터베이스 인덱스 친화적
  • 특징: 2025년 현재 가장 권장되는 버전
  • 버전 7은 시간순 정렬이 바람직할 때 좋은 대안으로, 무작위성과 정렬 가능성 사이의 좋은 균형을 제공한다.
  • 밀리초 내 모노토닉 증가를 보장하는 구현 방식은 플랫폼마다 다를 수 있음

버전 8 (사용자 정의)[편집 / 원본 편집]

  • 구성: 애플리케이션이 자유롭게 정의
  • 용도: 특수한 요구사항이 있는 커스텀 구현
  • 주의: 표준 호환성은 보장되지 않음

장단점[편집 / 원본 편집]

장점[편집 / 원본 편집]

  • 전 세계적 고유성: 분산 환경에서도 중복 없이 고유한 식별자 생성 가능
  • 충돌 가능성 극히 낮음: 2122 (≈5.3 × 1036)개의 조합
  • 독립성: 중앙 서버 없이도 생성 가능
  • 범용성: 대부분의 프로그래밍 언어와 플랫폼에서 지원
  • 표준화: RFC 표준으로 상호 운용성 보장

단점[편집 / 원본 편집]

  • 크기: 16바이트로 대규모 데이터베이스에서는 부담
  • 가독성: 사람이 읽고 기억하기 어려움
  • 정렬 문제: 버전 4는 무작위 생성으로 인덱스 파편화 심각
  • 보안 이슈: 버전 1, 6은 MAC 주소 노출 위험

충돌 확률[편집 / 원본 편집]

UUID의 충돌 확률은 천문학적으로 낮다.

  • 이론적 계산: 초당 10억 개의 UUID를 100년간 생성해도 50% 충돌 확률에 도달하지 않음
  • 실제 사례: 지금까지 공개된 UUID 충돌 사례는 0건
  • 비교: 로또 1등 당첨(약 10-8)보다 1028배 더 낮은 확률

구현 및 채택 현황[편집 / 원본 편집]

데이터베이스[편집 / 원본 편집]

  • PostgreSQL 18 (2025년 9월 정식 출시 예정): uuidv7() 함수 네이티브 지원
    • rand_a 부분을 서브밀리초 타임스탬프로 활용하여 초당 약 400만 개 UUID 생성 처리 가능
    • 단일 프로세스 내에서 모노토닉 증가 보장
    • uuid_extract_timestamp(), uuid_extract_version() 함수도 UUIDv7 지원
  • MariaDB 11.7: UUID_v7() 함수 제공
  • MySQL: 공식 네이티브 지원 없음 (커뮤니티 컴포넌트/플러그인으로 가능)
    • UUID() 함수는 버전 1만 지원
    • UUID_TO_BIN()의 swap flag로 타임스탬프 재배치 가능
  • SQLite: hex(randomblob(16)) 형태로 구현
  • DuckDB: 1.3.0에서 v7 지원 추가

프로그래밍 언어[편집 / 원본 편집]

Python[편집 / 원본 편집]

Python 3.14에서 UUID 버전 6, 7, 8이 표준 라이브러리에 공식 추가되었다.

import uuid

# 버전 4 (가장 일반적)
uuid4 = uuid.uuid4()

# 버전 1
uuid1 = uuid.uuid1()

# 버전 7 (Python 3.14+)
uuid7 = uuid.uuid7()

# 버전 8 (Python 3.14+)
uuid8 = uuid.uuid8()

# Python 3.13 이하에서는 외부 라이브러리 사용
# pip install uuid-utils 또는 uuid-extension

JavaScript/Node.js[편집 / 원본 편집]

// crypto 모듈 사용 (버전 4만 지원)
const { randomUUID } = require('crypto');
const uuid = randomUUID();

// uuid 패키지 사용 (모든 버전 지원)
const { v4: uuidv4, v7: uuidv7 } = require('uuid');
const id4 = uuidv4();
const id7 = uuidv7();

Java[편집 / 원본 편집]

Java OpenJDK에서 RFC 9562에 정의된 UUID 버전 7(UUIDv7) 지원 추가를 위한 작업이 진행 중이다(JDK-8334015). 현재는 외부 라이브러리를 통해 사용 가능하다.

// 표준 라이브러리 (버전 4만 지원)
UUID uuid = UUID.randomUUID();

// 버전 7은 외부 라이브러리 필요
// uuid-creator 라이브러리 사용 예시
import com.github.f4b6a3.uuid.UuidCreator;

UUID uuid7 = UuidCreator.getTimeOrderedEpoch();

.NET/C#[편집 / 원본 편집]

.NET 9 (2024년 11월 정식 출시)에서 Guid.CreateVersion7() 메서드가 추가되어 네이티브로 UUID v7을 지원한다.

// .NET 9.0 이상
var guid = Guid.CreateVersion7();

// 특정 타임스탬프로 생성
var guidWithTimestamp = Guid.CreateVersion7(DateTimeOffset.UtcNow);

// TimeProvider를 활용한 테스트 가능한 코드
var uuid = Guid.CreateVersion7(timeProvider.GetUtcNow());

// GUID 버전 확인
var version = guid.Version; // 7

// .NET 8 이하에서는 외부 라이브러리 필요

Go[편집 / 원본 편집]

// google/uuid 패키지
import "github.com/google/uuid"

// 버전 4
uuid := uuid.New()

// 버전 7 (v1.6.0+)
uuid7, err := uuid.NewV7()

PHP[편집 / 원본 편집]

PHP에서는 네이티브 UUID 지원이 제한적이므로 라이브러리를 사용하거나 직접 구현하는 방식을 사용한다.

라이브러리 사용 (ramsey/uuid)

ramsey/uuid는 가장 널리 사용되는 PHP UUID 라이브러리로, RFC 9562의 모든 버전(1-8)을 지원한다.

<?php
// Composer로 설치
// composer require ramsey/uuid

use Ramsey\Uuid\Uuid;

// 버전 4 (무작위)
$uuid4 = Uuid::uuid4();
echo $uuid4->toString(); // e.g. 25769c6c-d34d-4bfe-ba98-e0ee856f3e7a

// 버전 7 (시간순 정렬)
$uuid7 = Uuid::uuid7();
echo $uuid7->toString(); // e.g. 01921e85-f198-7490-9b89-7dd0d468543b

// 날짜/시간 정보 추출
printf("UUID: %s\n", $uuid7->toString());
printf("Version: %d\n", $uuid7->getFields()->getVersion());
printf("Date: %s\n", $uuid7->getDateTime()->format('Y-m-d H:i:s'));

// 특정 날짜로 버전 7 생성
$dateTime = new DateTimeImmutable('2025-01-01 00:00:00');
$uuid7WithDate = Uuid::uuid7($dateTime);

// 버전 1, 3, 5, 6, 8도 지원
$uuid1 = Uuid::uuid1();
$uuid5 = Uuid::uuid5(Uuid::NAMESPACE_DNS, 'example.com');
$uuid6 = Uuid::uuid6();

직접 구현 (버전 4)

외부 라이브러리 없이 간단한 UUID v4를 직접 구현할 수 있다.

<?php
function uuid4(): string 
{
    // PHP 7.0+ 필요
    $data = random_bytes(16);
    
    // 버전 비트 설정 (0100)
    $data[6] = chr(ord($data[6]) & 0x0f | 0x40);
    
    // 변형 비트 설정 (10xx)
    $data[8] = chr(ord($data[8]) & 0x3f | 0x80);
    
    // UUID 문자열 포맷
    return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4));
}

echo uuid4(); // e.g. 550e8400-e29b-41d4-a716-446655440000

직접 구현 (버전 7)

UUID v7도 비교적 간단하게 직접 구현 가능하다.

<?php
function uuid7(): string 
{
    static $last_timestamp = 0;
    
    // 현재 타임스탬프 (밀리초)
    $unixts_ms = intval(microtime(true) * 1000);
    
    // 모노토닉 증가 보장
    if ($last_timestamp >= $unixts_ms) {
        $unixts_ms = $last_timestamp + 1;
    }
    $last_timestamp = $unixts_ms;
    
    // 10바이트 랜덤 데이터 생성
    $data = random_bytes(10);
    
    // 버전 비트 설정 (0111)
    $data[0] = chr((ord($data[0]) & 0x0f) | 0x70);
    
    // 변형 비트 설정 (10xx)
    $data[2] = chr((ord($data[2]) & 0x3f) | 0x80);
    
    // 타임스탬프 + 랜덤 데이터 결합
    return vsprintf(
        '%s%s-%s-%s-%s-%s%s%s',
        str_split(
            str_pad(dechex($unixts_ms), 12, '0', STR_PAD_LEFT) . bin2hex($data),
            4
        )
    );
}

echo uuid7(); // e.g. 01921e85-f198-7490-9b89-7dd0d468543b

Laravel에서 사용

Laravel 11+에서는 Eloquent 모델에서 UUID를 쉽게 사용할 수 있다.

<?php
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Concerns\HasUuids;
use Illuminate\Database\Eloquent\Concerns\HasVersion7Uuids;

// 버전 4 UUID (기본)
class Product extends Model
{
    use HasUuids;
    
    // 자동으로 'id' 필드에 UUID v4 생성
}

// 버전 7 UUID (권장)
class Order extends Model
{
    use HasVersion7Uuids;
    
    // 자동으로 'id' 필드에 UUID v7 생성
    // 시간순 정렬 가능하여 데이터베이스 성능 향상
}

// 직접 생성
use Illuminate\Support\Str;

$uuid4 = Str::uuid();           // 버전 4
$uuid7 = Str::orderedUuid();    // 시간순 UUID (버전 4 기반)

Doctrine ORM 통합

<?php
use Doctrine\ORM\Mapping as ORM;
use Ramsey\Uuid\Doctrine\UuidV7Generator;
use Ramsey\Uuid\UuidInterface;

#[ORM\Entity]
#[ORM\Table(name: 'products')]
class Product
{
    #[ORM\Id]
    #[ORM\Column(type: 'uuid_binary', unique: true)]
    #[ORM\GeneratedValue(strategy: 'CUSTOM')]
    #[ORM\CustomIdGenerator(class: UuidV7Generator::class)]
    private UuidInterface $id;
    
    public function getId(): UuidInterface
    {
        return $this->id;
    }
}

경량 대안 라이브러리

대규모 의존성이 부담스러운 경우 경량 라이브러리 사용을 고려할 수 있다.

<?php
// oittaa/uuid-php (경량 라이브러리)
// composer require oittaa/uuid-php

use UUID\UUID;

$uuid4 = UUID::uuid4();
$uuid7 = UUID::uuid7();
$uuid8 = UUID::uuid8();

// 검증
$isValid = UUID::isValid('01921e85-f198-7490-9b89-7dd0d468543b');

다중 언어 구현[편집 / 원본 편집]

JavaScript에서 Zig까지, 제3자 종속성 없이 33개 언어로 구현된 UUIDv7이 있다.

주요 서비스 채택[편집 / 원본 편집]

  • GitHub: API 리소스 식별자
  • Discord: 스노우플레이크 ID (UUID 유사 구조)
  • MongoDB: ObjectId (UUID와 유사한 12바이트 식별자)
  • AWS: 다양한 리소스 식별자
  • Microsoft: COM, .NET GUID

성능 고려사항[편집 / 원본 편집]

데이터베이스 인덱스[편집 / 원본 편집]

버전 인덱스 성능 비고
버전 4 나쁨 B-tree 인덱스 파편화 심각, 랜덤 삽입으로 페이지 분할 빈번
버전 7 우수 시간 순 정렬로 인덱스 성능 향상, 순차 삽입으로 페이지 분할 최소화
버전 1, 6 보통 일부 정렬 가능하나 개인정보 노출

저장 공간[편집 / 원본 편집]

  • UUID (바이너리): 16바이트 (128비트)
  • UUID (문자열): 36바이트 (하이픈 포함)
  • 정수 ID: 4~8바이트
  • 성능 팁: 데이터베이스에서는 바이너리로 저장하고 필요시 문자열로 변환

보안 고려사항[편집 / 원본 편집]

예측 가능성[편집 / 원본 편집]

  • 버전 1, 6: MAC 주소와 시간 정보로 일부 예측 가능
  • 버전 4, 7: 난수 기반으로 예측 불가능
  • 버전 3, 5: 입력이 같으면 결과가 동일 (의도된 동작)

정보 노출 위험[편집 / 원본 편집]

  • MAC 주소: 버전 1, 6에서 하드웨어 정보 노출
  • 타임스탬프: 버전 1, 6, 7에서 생성 시간 추정 가능
  • 권장사항: 공개적으로 사용할 경우 버전 4나 7 사용, 보안에 민감한 경우 버전 4 선호

모노토닉 증가 이슈[편집 / 원본 편집]

  • .NET 9의 Guid.CreateVersion7()는 밀리초 내 모노토닉 증가를 보장하지 않음 (순수 랜덤)
  • PostgreSQL 18의 uuidv7()는 단일 프로세스 내에서 모노토닉 증가 보장
  • 배치 처리나 트랜잭션에서 엄격한 순서가 필요한 경우 ULID 같은 대안 고려

실무 사용 패턴[편집 / 원본 편집]

언제 UUID를 사용할까?[편집 / 원본 편집]

사용하면 좋은 경우

  • 분산 시스템에서 고유 식별자 필요
  • 마이크로서비스 간 데이터 교환
  • API 리소스 식별자
  • 세션 ID, 토큰
  • 파일명, 임시 디렉토리명
  • 다중 데이터베이스 환경에서의 병합

사용하지 않는 것이 좋은 경우

  • 순차적 번호가 필요한 경우 (주문번호 등)
  • 사용자가 직접 입력해야 하는 경우
  • 메모리/저장공간이 매우 제한적인 환경
  • 초고성능이 필요한 정수 연산
  • 단일 서버 환경에서 AUTO_INCREMENT로 충분한 경우

버전 선택 가이드[편집 / 원본 편집]

용도 권장 버전 이유
일반적인 식별자 v4 간단하고 안전, 예측 불가능
데이터베이스 PK v7 인덱스 성능 우수, 시간순 정렬
시간 순서 중요 v7 밀리초 단위 정렬, 삽입 성능 우수
결정적 생성 v5 같은 입력 → 같은 결과
레거시 호환 v1 기존 시스템과의 호환성
보안 토큰 v4 완전 무작위, 예측 불가

최신 동향 및 발전 방향[편집 / 원본 편집]

RFC 9562의 주요 변화[편집 / 원본 편집]

  • 새로운 버전 추가: 버전 6, 7, 8의 정식 표준화
  • 명확화: 기존 사양의 모호한 부분들 정리
  • 현대적 요구사항 반영: 대용량 데이터베이스와 분산 시스템에 최적화

2024-2025년 업계 채택 동향[편집 / 원본 편집]

  • 데이터베이스 엔진:
    • PostgreSQL 18에서 uuidv7() 네이티브 지원 (2025년 5월 베타, 9월 정식 출시 예정)
    • MariaDB 11.7에서 UUID_v7() 함수 추가
    • MySQL은 아직 공식 지원 없음 (커뮤니티 확장으로 가능)
  • 프로그래밍 언어:
    • .NET 9에서 Guid.CreateVersion7() 네이티브 지원 (2024년 11월 출시)
    • Python 3.14에서 uuid.uuid7() 표준 라이브러리 추가 (2025년)
    • Java OpenJDK에서 UUID.epochMillis() 구현 진행 중 (JDK-8334015)
  • 라이브러리 생태계: 다양한 언어에서 제3자 라이브러리 형태로 빠른 채택
  • 산업 트렌드: 버전 4에서 버전 7로의 점진적 마이그레이션 추세

향후 전망[편집 / 원본 편집]

  • 주요 데이터베이스 엔진의 UUID v7 표준 지원 확대
  • ORM 및 프레임워크의 네이티브 UUID v7 지원
  • 레거시 시스템에서 UUID v4 → v7 마이그레이션 증가
  • 클라우드 네이티브 애플리케이션에서 UUID v7이 사실상의 표준으로 자리잡을 전망

트리비아[편집 / 원본 편집]

  • UUID의 nil UUID는 모든 비트가 0인 00000000-0000-0000-0000-000000000000이다
  • 브라켓 표기법도 존재한다: {123e4567-e89b-12d3-a456-426614174000}
  • Microsoft는 UUID를 GUID(Globally Unique Identifier)라고 부른다
  • PostgreSQL에서 UUID는 native 타입으로 지원되어 저장 공간을 절약할 수 있다
  • 버전 7의 등장으로 Twitter의 Snowflake ID와 유사한 기능을 표준으로 사용할 수 있게 되었다
  • .NET의 Guid와 SQL Server의 uniqueidentifier는 바이트 순서가 다르므로 변환 시 주의 필요
  • Python 3.14의 uuid7() 구현은 42비트 카운터를 사용하여 밀리초 내 모노토닉 증가 보장

같이 보기[편집 / 원본 편집]

각주[편집 / 원본 편집]


외부 링크[편집 / 원본 편집]

최근 바뀜

더 보기