UUID란? — 중복 걱정 없는 ID가 만들어지는 원리
개발을 하다 보면 550e8400-e29b-41d4-a716-446655440000 같은 36자 문자열을 자주 만납니다. 이것이 UUID입니다. 서로 모르는 컴퓨터들이 상의 없이 각자 ID를 만들어도 겹치지 않게 하는 장치죠. 어떻게 그게 가능한지, 언제 쓰는지 정리합니다.
UUID의 정체 — 128비트 식별자
UUID(Universally Unique IDentifier)는 128비트 숫자입니다. 사람이 읽기 좋게 16진수로 적고 하이픈으로 8-4-4-4-12 자리로 끊은 것이 우리가 보는 36자 형태입니다.
- 형식:
xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx— M 자리에 버전(4면 v4), N 자리에 변형 정보가 들어갑니다. - 대소문자는 구분하지 않으며 표준 표기는 소문자입니다.
- 데이터베이스의 기본 키, 파일·주문·세션 ID, 분산 시스템의 요청 추적 ID 등 "전 세계에서 유일해야 하는 이름"이 필요한 곳에 쓰입니다.
왜 필요한가 — 순번 ID의 한계
ID를 1, 2, 3… 순번으로 매기는 방식은 한 곳에서 발급할 때는 완벽합니다. 문제는 발급처가 여럿일 때입니다.
- 충돌: 서버 두 대가 동시에 "다음 번호는 101"이라고 판단하면 같은 ID가 두 개 생깁니다. 이를 막으려면 중앙에서 줄을 세워야 하고, 그만큼 느려집니다.
- 추측 가능:
order/42다음에order/43이 있다는 걸 누구나 압니다. 외부에 노출되는 ID가 순번이면 전체 규모와 다른 데이터의 존재가 드러납니다. - 병합 곤란: 오프라인 기기에서 만든 데이터를 나중에 합칠 때, 순번끼리는 반드시 겹칩니다.
정말 안 겹칠까 — 확률의 직관
v4 UUID는 122비트가 무작위입니다. 가능한 값이 약 5.3×10³⁶개로, 초당 10억 개씩 100년을 만들어도 충돌 확률은 사실상 0으로 취급할 수 있는 수준입니다. 그래서 실무에서는 "안 겹친다"고 간주하되, 데이터베이스에는 UNIQUE 제약을 함께 걸어 만약의 경우까지 차단하는 것이 관례입니다.
버전 구분 — v1·v4·v7
- v1 — 생성 시각 + 기기(MAC 주소) 기반. 순서가 있지만 기기 정보가 노출되고 예측 가능합니다.
- v4 — 완전 무작위. 가장 널리 쓰이는 기본 선택지입니다.
- v7 — 앞부분은 타임스탬프, 뒷부분은 무작위. 시간순 정렬이 가능해 데이터베이스 인덱스 성능에 유리한 최신 표준입니다.
- 일반 용도라면 v4를 생성해 그대로 쓰면 됩니다.
- 필요한 개수만큼 한 번에 만들어 복사합니다.
- 대문자가 필요한 환경이면 변환해도 같은 값으로 취급됩니다.
이론상 겹칠 수 있지만 확률이 무시할 수 있을 만큼 작습니다. v4 UUID는 122비트의 무작위 값을 담는데, 초당 10억 개씩 100년을 만들어도 충돌 확률이 사실상 0에 가깝습니다. 그래서 실무에서는 '안 겹친다'고 간주하고 쓰되, 데이터베이스에서는 UNIQUE 제약을 함께 걸어 만약의 경우까지 막는 것이 관례입니다.
한 곳에서만 번호를 만들면 그게 더 간단합니다. 문제는 여러 서버·여러 기기가 동시에 ID를 만들어야 할 때입니다. 자동 증가 번호는 중앙에서 순서를 관리해야 충돌이 없는데, UUID는 서로 통신하지 않고도 각자 만들어 합쳐도 겹치지 않습니다. 또 순번 ID는 'id=42 다음은 43'처럼 추측이 가능해 외부에 노출되는 ID로는 UUID가 더 안전합니다.
만드는 재료가 다릅니다. v1은 생성 시각과 기기(MAC 주소) 정보 기반이라 순서는 있지만 기기 정보가 노출됩니다. v4는 완전 무작위로 가장 널리 쓰입니다. v7은 앞부분에 타임스탬프를 넣고 뒤를 무작위로 채워, 시간순 정렬이 가능하면서도 충돌이 없어 데이터베이스 키 용도로 주목받는 최신 표준입니다. 일반 용도라면 v4면 충분합니다.