CS

UUID란 무엇인가(부제: PK 정하기)

사과만쥬 2024. 11. 17. 11:12

개인 사이드 프로젝트를 진행하기 위해 여러 가지 옵션을 고민하고 있다.

 

카카오 소셜 로그인으로 회원정보를 구현하려고 설계하는 과정에서, 처음에는 카카오 이메일로 PK를 설정하려고 했었다.

그러나, 다른 분들이 "카카오 사이트가 없어질 가능성을 배제해서는 안 된다."라는 뉘앙스로 이야기를 해주셨고, 그러나 내 사이트가 없어질 확률보다 카카오 사이트가 없어질 확률이 더 낮음 PK를 AUTO_INCREMENT하는 방식과 UUID를 고민하게 되었다.

 

 

 

그래서 최종적으로 내린 결론은 UUID를 설정하는 것이었다.

AUTO_INCREMENT하는 방식은 회원 정보라는 특성 상 보안에 신경써야 하기 때문에, 회원정보를 다루는 경우에는 부적절하다. 예측 가능하다는 특성 상 악의적인 사용자가 다음 값을 쉽게 추측할 수 있어, 회원정보에는 쓰이지 않는다.

보안적으로 문제 없는 데이터(ex 도서 정보)에는 AUTO_INCREMENT가 편의성적인 측면에서 많이 쓰인다.

실제로 기존에 진행했던 도서 관련 프로젝트에서 PK를 단순히 AUTO_INCREMENT로 설정해서 작업하였다.

 

 

 

위와 같은 이유로 회원정보에 있어서는 PK를 UUID로 설정하기로 하였고, 관련해서 UUID가 뭔지 알아보고, 자바에서 UUID를 어떻게 쓰는지 예시 코드를 통해서 설명하려고 한다.

 

 


1. UUID(Universally Unique Identifier)란 무엇인가?

 

UUID는 전 세계적으로 고유성을 보장하는 식별자를 생성하기 위한 표준으로, 128비트(16바이트) 크기의 값을 사용합니다. 일반적으로 UUID는 사람이 읽을 수 있는 형식으로 36자의 문자열(8-4-4-4-12 형태)로 표현됩니다.

 

550e8400-e29b-41d4-a716-446655440000

 

2. UUID의 주요 구성 요소

일반적으로 5개의 그룹으로 나뉩니다.

 

xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx
  1. xxxxxxxx: 첫 번째 그룹 (32비트)
  2. xxxx: 두 번째 그룹 (16비트)
  3. Mxxx: 세 번째 그룹 (16비트, 버전 정보 포함)
  4. Nxxx: 네 번째 그룹 (16비트, 변형/가변 정보 포함)
  5. xxxxxxxxxxxx: 다섯 번째 그룹 (48비트)
  • M: UUID 버전을 나타냄 (예: 1, 4).
  • N: UUID 변형을 나타냄 (예: 10xx는 표준 UUID).

 

 

3. UUID의 성능

인덱스 성능

  • 랜덤한 UUID 값은 B-Tree와 같은 인덱스 구조에서 비효율적일 수 있음.
    • 해결 방안: UUID를 정렬된 방식으로 생성(예: UUID 버전 1)하거나, 별도의 정렬된 컬럼을 추가.

저장 공간

  • UUID는 16바이트로, 일반적인 Auto Increment 정수(4~8바이트)보다 더 많은 저장 공간을 필요로 함.
    • 해결 방안: UUID를 바이너리로 저장하거나, 압축 기법을 사용.

 

4. 자바에서 UUID 생성하기

 

import java.util.UUID;
UUID uuid = UUID.randomUUID();