Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
Tags
- JPQL
- docker compose
- mybatis
- CORS
- 쿠버네티스
- Web
- AWS
- 스프링 부트
- docker
- 컨테이너
- 페이징
- @Transactional
- redis
- DI
- MSA
- Dead Letter Queue
- Spring Data JPA
- JWT
- JPA
- JdbcTemplate
- kafka
- Spring Container
- DLQ
- Spring
- 지연 로딩
- dockerhub
- @ComponentScan
- securitycontextholderfilter
- 서블릿 컨테이너
- Routing Key
Archives
- Today
- Total
look-forest
Primary key 생성 전략 본문
분산 데이터베이스 환경에서는 PK를 어떻게 생성하면 좋을까?
나는 당연히 auto_increment가 간단하고 좋을 것이라고 생각했다.
후보
- DB auto_increment
- 유니크 문자열 or 숫자
- 유니크 정렬 문자열
- 유니크 정렬 숫자
DB auto_increment
문제점
1. 분산 데이터베이스 환경에서 DB auto_increment를 쓸 경우, PK가 중복될 수 있기 때문에 식별자의 유일성이 보장되지 않는다!

2. 클라이언트 측에 노출하면 보안 문제(데이터 개수 또는 특정 시점의 식별자 예측 가능)
ex) 방금 가입했더니 user_id가 1000이라면 -> 1000명의 회원이 있음 유추 가능
장점
간단하므로 다음 상황에서 유리
- 보안적인 문제를 크게 고려하지 않는 상황
- 단일 DB를 사용하거나 애플리케이션에서 PK 중복을 직접 구분하는 상황
참고
보안적인 문제만 염려된다면 PK는 DB 내 식별자로 활용하고 앱 내 식별자를 위해 별도 유니크 인덱스 사용 가능
- PK = id(DB auto_increment)
- unique index = article_id(UUID 등)
- Client는 article_id만 식별자로서 노출 및 사용
- but Secendary index로 포인터(PK) 찾은 후, Clustered index 접근하므로 조회 비용 증가
유니크 문자열 or 숫자
UUID 또는 난수를 생성하여 PK 지정 (정렬 데이터가 아니라 랜덤 데이터를 삽입하는 것)
장점
키 생성 방식이 간단
문제점
랜덤 데이터로 인해 성능 저하
- Clustered Index는 정렬된 상태를 유지한다.
- 데이터 삽입 시 필요한 인덱스 페이지가 가득 찼다면, B+tree 재구성 및 페이지 분할로 디스크 I/O 증가
- PK를 이용한 범위 조회 시 디스크에서 랜덤 I/O가 발생하므로, 순차 I/O보다 성능 저하
정렬 가능한 ID는 클러스터형 인덱스(InnoDB의 경우 PK)의 물리적 저장 순서와 유사하게 생성되어
페이지 분할 및 재구성을 줄여 쓰기 및 범위 쿼리의 디스크 I/O 효율을 높인다.
유니크 정렬 문자열
UUID v7, ULID 등의 알고리즘을 통해 생성 (보통 128 비트 사용)
장점
- 분산 환경에 대한 PK 중복 문제 해결
- 보안 문제 해결
- 랜덤 데이터에 의한 성능 문제 해결
문제점
데이터 크기에 따라, 공간 및 성능 효율이 달라진다.
- Clustered Index는 PK를 기준으로 만들어진다.
- Secondary Index는 데이터에 접근할 수 있는 포인터, 즉 PK를 가진다
- PK가 크면 클수록, 데이터는 더 많은 공간을 차지하고, 비교 연산에 의한 정렬/조회에 더 많은 비용을 소모한다.
유니크 정렬 숫자
장점
앞서 살펴본 문자열 방식의 장점을 모두 취하면서, 보다 적은 공간을 사용한다.
snowflake, TSID 등의 알고리즘은 64비트 사용(BIGINT)
- 정렬을 위해 타임스탬프를 나타내는 비트 수 제한으로, 문자열에 비해 키 생성을 위한 시간적인 한계가 있을 수 있음
결론
상황에 따라 다르겠지만, 분산 DB 환경에서는 유니크 정렬 숫자를 채택하는 것이 좋아보인다.
- PK가 분산 DB 환경에서 중복되지 않으면서,
- 클라이언트에 노출되어도 보안 문제가 없어야하며,
- 정렬된 값이라 인덱스 성능에도 좋고,
- 문자열보다 크기가 작다!
참고 자료 & 이미지 출처
스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
'Architecture > 대규모 시스템 설계' 카테고리의 다른 글
| 계층형 구조와 페이징(feat.댓글) (0) | 2026.01.23 |
|---|---|
| 대용량 데이터의 조회(feat.페이징,인덱스) (0) | 2026.01.03 |
| Distributed Database (0) | 2026.01.02 |
| 프로젝트 셋팅 (0) | 2026.01.02 |
| 시스템 아키텍처 기초 (0) | 2025.12.26 |