💡 고유 식별자(Identifier) 완벽 설계 가이드: UUID vs ULID
현대의 백엔드 개발과 데이터베이스 설계에서 기본키(Primary Key, PK)를 어떻게 설정하느냐는 전체 시스템의 성능을 좌우하는 가장 중요한 요소입니다. 과거 단일 데이터베이스 환경에서는 단순한 자동 증가 정수(Auto-Increment Integer)를 주로 사용했지만, 데이터를 분산 저장하는 마이크로서비스 아키텍처(MSA) 시대가 도래하면서 여러 서버에서 동시에 데이터를 생성해도 절대 충돌이 나지 않는 범용 고유 식별자(Universally Unique Identifier)의 도입이 필수가 되었습니다.
1. UUID v4 (난수 기반 식별자)
가장 널리 쓰이는 국제 표준 식별자입니다. f47ac10b-58cc-4372-a567-0e02b2c3d479 와 같이 32개의 16진수와 4개의 하이픈(-)으로 구성되어 총 36자의 길이를 가집니다.
- 보안성 및 고유성: 완전한 무작위 난수(Random) 기반으로 생성되므로 고유성이 완벽하게 보장됩니다. 해커나 외부 사용자가 이전/다음 데이터를 추측(Guessing)하는 것이 수학적으로 불가능하여 보안성이 매우 높습니다.
- 치명적 단점 (DB 인덱스 파편화): 생성된 값들 사이에 '순서'가 존재하지 않는 무작위 문자열입니다. 따라서 MySQL의 InnoDB 같은 B-Tree 인덱스 구조에서 기본키로 사용할 경우, 데이터가 중간중간 끼어 들어가는 인덱스 파편화(Page Split) 현상이 심각하게 발생하여 삽입(Insert) 성능이 기하급수적으로 떨어지는 단점이 있습니다.
2. ULID (정렬 가능한 모던 식별자)
ULID(Universally Unique Lexicographically Sortable Identifier)는 UUID의 치명적인 단점인 '정렬 불가능' 문제를 완벽하게 해결하기 위해 등장한 차세대 식별자입니다. 01ARZ3NDEKTSV4RRFFQ69G5FAV 와 같이 26자리의 영문자 및 숫자로 구성됩니다.
- 시간순 완벽 정렬 (Lexicographically Sortable): ULID의 가장 큰 특징입니다. 앞의 10자리는 밀리초(ms) 단위의 타임스탬프(Timestamp) 정보를 담고 있고, 뒤의 16자리는 무작위 난수로 구성됩니다. 따라서 생성된 시간 순서대로 텍스트 정렬이 완벽하게 보장되며, DB의 기본키로 사용 시 Auto-Increment 정수형과 유사할 정도로 인덱싱 성능이 뛰어납니다.
- URL 안전성 확보: UUID와 달리 URL에서 문제를 일으킬 수 있는 하이픈(-)이 아예 존재하지 않습니다. 또한 대소문자를 구분하지 않고 헷갈리기 쉬운 글자(I, L, O, U)를 제외한 Crockford의 Base32 인코딩을 사용하여 사용자와 브라우저 모두에게 안전합니다.
- 100% 하위 호환성: 문자의 길이는 26자로 UUID(36자)보다 짧아 보이지만, 내부적으로 차지하는 용량은 128비트로 UUID와 정확히 동일합니다. 따라서 기존에 UUID를 저장하던 DB 컬럼 구조를 변경하지 않고도 바로 호환하여 저장할 수 있습니다.
본 사이트의 대량 생성 툴은 별도의 외부 서버 통신 없이 사용자의 브라우저 로컬 환경(Client-Side JavaScript)에서 실시간 연산을 통해 식별자를 생성합니다. 따라서 민감한 내부망 프로젝트를 위한 대량의 더미 데이터가 필요할 때 100% 안전하고 무제한으로 활용하실 수 있습니다.