목록으로
유틸리티

UUID 사용법 완벽 가이드: 버전 선택부터 실무 적용까지 5단계

UUID 사용법을 제대로 익혀두면 서버가 여러 대로 늘어나도 중복 없는 고유 식별자를 만들 수 있습니다. 자동 증가 정수 키만 쓰다가 분산 환경이나 외부 공개 API를 만나면 반드시 마주치게 되는 주제이므로, 개념부터 실무 적용까지 순서대로 정리해 보겠습니다.

1단계: UUID의 구조와 표기 방식 이해하기

UUID는 128비트 길이의 값이며, 사람이 읽을 때는 16진수 32자리를 하이픈으로 나눈 8-4-4-4-12 형식으로 표기합니다. 하이픈을 포함하면 총 36자입니다.

550e8400-e29b-41d4-a716-446655440000

세 번째 그룹의 첫 글자는 버전 번호를, 네 번째 그룹의 첫 글자는 변형(variant) 정보를 담습니다. 위 예시의 41d4에서 앞자리 4는 이 값이 버전 4 UUID라는 뜻입니다. 문자열만 보고도 어떤 방식으로 만들어진 값인지 바로 확인할 수 있습니다.

참고: 마이크로소프트 진영에서 쓰는 GUID는 UUID와 사실상 같은 규격입니다. 표기할 때 중괄호를 감싸거나 대문자를 쓰는 관행 차이만 있을 뿐, 값 자체는 호환됩니다.

2단계: 버전별 차이를 알고 목적에 맞게 고르기

UUID는 생성 방식에 따라 여러 버전으로 나뉩니다. 무작정 v4만 쓰기보다는 용도에 맞는 버전을 선택하는 것이 좋습니다.

버전생성 방식주요 용도
v1타임스탬프 + 노드 정보생성 시각 추적이 필요한 레거시 시스템
v3네임스페이스 + MD5 해시같은 입력에 항상 같은 값이 필요한 경우
v4난수 기반일반적인 식별자, 세션 키, 파일명
v5네임스페이스 + SHA-1 해시v3의 대체, 결정적 식별자 생성
v7유닉스 밀리초 시각 + 난수데이터베이스 기본 키, 시간순 정렬
예측 불가능성이 중요하면 v4, 데이터베이스에 저장하며 정렬 이점까지 얻고 싶다면 v7이 기본 선택지입니다.

v7은 RFC 9562에 정식 포함된 비교적 최근 규격입니다. 앞부분이 시각 정보라서 생성 순서대로 대략 정렬되며, 뒤쪽 난수 덕분에 값 자체를 추측하기는 어렵습니다.

3단계: 환경별 UUID 생성 코드 작성하기

대부분의 언어는 표준 라이브러리만으로 UUID를 만들 수 있습니다. 외부 패키지를 먼저 찾기 전에 내장 기능부터 확인하시기 바랍니다.

  • JavaScript: crypto.randomUUID() 한 줄로 v4 생성이 가능하며 최신 브라우저와 Node.js 모두 지원합니다.
  • Python: import uuidstr(uuid.uuid4())를 사용합니다.
  • Java: UUID.randomUUID().toString()으로 생성합니다.
  • PHP: ramsey/uuid 패키지의 Uuid::uuid4()가 사실상 표준입니다.
  • MySQL: SELECT UUID();는 v1을 반환하므로 버전 차이에 유의해야 합니다.
  • PostgreSQL: 13 버전 이상에서 gen_random_uuid()를 별도 확장 없이 쓸 수 있습니다.

테스트 데이터를 채우거나 설정 파일에 넣을 값이 몇 개만 필요한 상황이라면, 코드를 작성하는 대신 UUID 생성기로 즉시 뽑아 쓰는 편이 빠릅니다.

주의: 직접 난수를 조합해 UUID 형식 문자열을 만드는 방식은 피하시기 바랍니다. Math.random() 같은 일반 난수 함수는 암호학적으로 안전하지 않아 값이 예측될 수 있고, 버전 및 변형 비트가 어긋나면 표준 파서에서 오류가 발생합니다.

4단계: 데이터베이스에 효율적으로 저장하기

UUID를 기본 키로 쓸 때 가장 흔한 실패 사례는 VARCHAR(36) 컬럼에 문자열 그대로 저장하는 것입니다. 저장 공간이 정수 키보다 훨씬 커지고, 인덱스가 커질수록 조회 성능도 떨어집니다.

  1. MySQL에서는 BINARY(16) 컬럼을 쓰면 36바이트가 16바이트로 줄어듭니다.
  2. PostgreSQL은 uuid 전용 타입이 있으므로 이를 사용하면 내부적으로 16바이트로 저장됩니다.
  3. 조회 편의가 필요하면 문자열 변환을 뷰나 애플리케이션 계층에서 처리합니다.

또 하나 고려할 점은 삽입 성능입니다. v4는 값이 완전히 무작위라서 인덱스 트리 여기저기에 삽입되고, 그 과정에서 페이지 분할이 잦아집니다. 데이터가 수백만 건 이상 쌓이는 테이블이라면 시간순으로 증가하는 v7을 쓰는 것만으로 쓰기 성능이 눈에 띄게 개선됩니다.

팁: MySQL 8.0에서는 UUID_TO_BIN(uuid_value, 1)의 두 번째 인자를 1로 주면 v1 UUID의 시간 필드를 앞으로 재배치해 순차성을 확보할 수 있습니다. 반대 변환은 BIN_TO_UUID(col, 1)입니다.

5단계: 실무 적용 전 점검 목록

도입 직전에 아래 항목을 확인하면 대부분의 시행착오를 줄일 수 있습니다.

  • URL이나 파일명에 노출되는 값이라면 v1은 피합니다. 생성 시각과 장비 정보가 값에 남습니다.
  • 대소문자 처리 규칙을 한쪽으로 통일합니다. 보통 소문자 표기를 표준으로 삼습니다.
  • 하이픈 유무를 API 명세에 명확히 적어 둡니다. 클라이언트마다 다르게 처리하면 비교 로직이 깨집니다.
  • UUID는 고유성을 보장할 뿐 인증 수단이 아닙니다. 값을 아는 사람에게 접근을 허용하는 설계는 위험합니다.
  • 내부 관리용 순번이 필요하다면 정수 키를 별도로 두고 UUID는 외부 노출용으로만 쓰는 이중 키 구조도 좋은 선택입니다.

정리하면 UUID 사용법의 핵심은 버전 선택과 저장 방식 두 가지에 있습니다. 용도에 맞는 버전을 고르고 이진 형태로 저장하는 습관만 들여도, 식별자 때문에 생기는 문제 대부분을 미리 막을 수 있습니다.

자동차 수리가 필요하신가요?

대전 사고차 수리 전문 - 남대전자동차공업사

무료 견적받기