UUID 설명: 버전·활용 사례·자동 증가 대신 쓰는 경우

발행: (2026년 6월 9일 PM 07:13 GMT+9)
7 분 소요
원문: Dev.to

출처: 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가 순수히 내부용이고 순차적 순서가 중요할 때는 자동 증가가 여전히 최선의 답입니다.

0 조회
Back to Blog

관련 글

더 보기 »

Eidentic 소개

Today we're releasing Eidentic, an open-source TypeScript SDK for building AI agents with self-improving memory and the production fundamentals built in — not b...

Typescript의 타입

Introdução Tipos são uma forma de definir a “forma” ou o contrato dos dados que estamos usando no código. Pensando em Javascript puro, ele é dinâmico: você pode...