서론
- 데이터베이스에서 레코드를 식별하는 ID는 설계에서 핵심적인 역할을 한다.
- 일반적으로 사용하는 두 가지 방식: UUID와 Sequential ID(자동 증가형 숫자)
- 각각의 장단점을 이해하면 성능, 보안, 확장성 측면에서 합리적인 선택이 가능하다.
1. Sequential ID
정의
- 1, 2, 3 … 처럼 순차적으로 증가하는 숫자형 ID
- 데이터베이스에서 흔히 AUTO_INCREMENT 또는 SERIAL로 구현
장점
- 읽기와 쓰기 성능 우수
- 인덱스가 순차적이라 B-Tree 구조에서 페이지 분할(page split)이 적음
- 간단하고 직관적
- 레코드 순서 확인이 쉬움
- 저장 공간 효율적
- INT/ BIGINT 사용, UUID보다 2~4배 적은 공간
단점
- 병합과 분산 시스템에서 충돌 위험
- 여러 DB나 마이크로서비스에서 ID를 생성하면 중복 가능성 있음
- 보안 취약
- 순차적 ID는 추측 가능, 공격자에게 레코드 노출 가능
- 데이터 이동 시 조정 필요
- 데이터 이관/복제 시 ID 충돌 처리 필요
2. UUID
정의
- Universally Unique Identifier, 128비트 고유값
- 550e8400-e29b-41d4-a716-446655440000 형태
장점
- 전역 고유성 보장
- 분산 시스템, 여러 DB, 클러스터 환경에서 충돌 걱정 없음
- 보안적 장점
- 레코드 추측이 어려워 데이터 노출 위험 감소
- 데이터 마이그레이션 자유로움
- 다른 시스템과 병합, 이동 시 충돌 거의 없음
단점
- 성능 저하 가능
- 랜덤 값이므로 B-Tree 인덱스에 삽입 시 페이지 분할 증가
- 공간 차지
- 16바이트 이상, BIGINT 대비 2배 이상
- 가독성 낮음
- 사람이 확인/관리하기 힘듦
3. 선택 가이드라인
상황추천 ID 타입이유
| 단일 DB, 단순 CRUD | Sequential ID | 성능과 직관성 우위 |
| 분산 시스템, 마이크로서비스 | UUID | 충돌 방지, 독립성 확보 |
| 보안 민감 데이터 | UUID | ID 추측 방지 |
| 로그, 분석 데이터 | Sequential ID | 정렬, 저장 효율성 |
4. 혼합 전략
- Sequential + UUID Hash: 외부 공개는 UUID, 내부 DB는 sequential
- ULID, KSUID: 시간 기반 UUID로 인덱스 충돌 최소화
- 데이터 성격과 시스템 구조에 따라 적절히 선택
결론
- 정답은 없다.
- 성능, 분산, 보안, 가독성 요구사항을 모두 고려해야 한다.
- 설계 초기부터 ID 전략을 정의하지 않으면 나중에 바꾸기 힘들다.
'개발일지 > SPRINGBOOT' 카테고리의 다른 글
| Spring HttpInterface 한 번에 이해하기 (0) | 2025.12.19 |
|---|---|
| springboot , record 를 통한 dto (0) | 2025.12.16 |
| JPA에서 @ManyToOne과 @OneToMany, 그리고 양방향 매핑의 차이 (0) | 2025.10.11 |
| Spring Data Envers와 RevisionRepository로 엔티티 변경 이력 관리하기 (0) | 2025.10.08 |
| Spring Boot에서 Swagger로 API 문서 자동화하기 (2) | 2025.08.02 |