서버 두 대가 동시에 데이터를 저장하면 같은 ID가 만들어질 수 있다. 자동 증가 번호(auto increment)는 서버 한 대에서만 쓸 때는 문제없지만, 분산 환경이나 마이크로서비스에서는 충돌 위험이 있다. UUID는 중앙 관리 없이도 겹치지 않는 ID를 만들어 준다.
UUID 구조
UUID(Universally Unique Identifier)는 128비트 길이의 고유 식별자다. 32자리 16진수를 하이픈으로 구분해서 표시한다.
550e8400-e29b-41d4-a716-446655440000
8-4-4-4-12 자리로 나뉘어 있고, 세 번째 블록 첫 자리가 버전 번호다. 위 예시에서 4가 보이면 UUID v4라는 뜻이다. 가능한 조합 수가 약 3.4 × 1038개여서, 매초 10억 개씩 만들어도 수백 년간 겹칠 확률이 사실상 없다. 마이크로소프트 생태계에서는 같은 것을 GUID(Globally Unique Identifier)라고 부르는데, 구조와 원리는 동일하다.
auto increment 대신 UUID를 쓰는 이유
- 분산 생성: 서버 여러 대가 동시에 ID를 만들어도 중앙 DB에 물어볼 필요가 없다
- 병합 용이: 서로 다른 데이터베이스를 합칠 때 ID 충돌이 발생하지 않는다
- 예측 불가: 순차 번호는 URL에 노출되면 전체 건수를 추측할 수 있지만, UUID는 패턴이 없어서 정보가 새지 않는다
- 오프라인 생성: 네트워크 없이 클라이언트에서 바로 ID를 만들 수 있다
참고 UUID의 단점도 있다. 36자로 길어서 저장 공간을 더 차지하고, 순차적이지 않아서 DB 인덱스 성능에 영향을 줄 수 있다. 간단한 단일 서버 프로젝트라면 auto increment로 충분하다.
UUID 버전: v1과 v4 차이
실무에서 주로 쓰는 건 v1과 v4 두 가지다.
- UUID v1
- 타임스탬프와 MAC 주소를 조합해서 만든다. 생성 시각 순서가 유지되어 DB 정렬에 유리하지만, MAC 주소가 노출되는 보안 문제가 있다.
- UUID v4
- 122비트를 완전 랜덤으로 채운다. 시간이나 장비 정보가 포함되지 않아 가장 널리 쓰인다. 대부분의 프레임워크와 라이브러리가 기본으로 v4를 생성한다.
대량으로 생성해야 할 때
테스트 데이터를 만들거나 마이그레이션 스크립트에 UUID가 수십 개 필요한 상황이라면, 코드를 작성하는 것보다 UUID 생성기를 쓰는 게 빠르다. 한 번에 최대 1,000개까지 뽑을 수 있고, 하이픈 제거, 중괄호 포함, URN 형식 등 포맷도 선택할 수 있다.
- 암호학적 난수 기반(crypto.getRandomValues)으로 생성
- 대문자 변환 옵션 지원
- 결과를 텍스트 파일로 다운로드 가능
ID 한두 개는 코드에서 직접 만들면 되지만, 수십 개가 한꺼번에 필요한 상황이라면 생성기에서 뽑아서 붙여넣는 게 시간을 줄이는 방법이다.