[백엔드] PK채번을 위한 다양한 방안들

Hyo Kyun Lee·2025년 9월 25일
0

백엔드

목록 보기
22/26

1. 개요

지금까지 생각없이 UUID/Time Stamp/Auto Increment 등 단일DB에서 유일성을 보장하기 위한 채번방안만을 고려하였는데, 이를 넘어 분산DB 환경 및 인덱스 환경까지 고려한 적절한 채번방안을 마련해야 한다는 것을 깨닫게 되었다.

이에 대해 공부하면서 정리한 내용을 기록해본다.

2. PK채번전략

단순히 유일성을 보장하는 방법을 넘어, 분산 데이터베이스 및 보안 등 여러 상황을 고려한 PK채번전략이 필요하다.

2-1. DB Auto Increment

DBMS에서 제공하는 Auto Increment 체계를 활용하여 PK를 채번하는 전략

  • 단일 DBMS에서 제공하는 Auto Increment를 가정하므로, 분산DB 환경에서는 PK가 중복될 수 있으므로(특히 샤딩키를 제외한 나머지 컬럼이 복합PK로 설정되어있을 경우), 분산DB에서의 유일성이 보장되지 않는다.
  • Auto Increment가 Client 측에 노출된다면, 데이터 개수나 식별자를 예측할 수 있어 안정성에도 취약할 수 있다.
  • 가장 간단하지만, 보안적인 부분이 중대하지 않을 경우나 단일 DB를 사용하는 등 환경적으로 간단한 상황에서만 사용을 권장한다.

만약 DB Auto Increment를 PK로 사용하되 보안적인 부분이 염려될 경우, PK(DB 식별자)의 역할로만 Auto Increment를 사용하고 Client 측에 노출하지 않도록 한다.

Client에서 사용하는 식별자는 게시판 ID(article ID) 등 별도의 unique index를 사용한다.

2-1-1. PK(DB 식별자)와 Client 식별자가 다를 경우 생길 수 있는 문제점

DB에서 운용하는 식별자와 Client의 데이터를 식별하기 위한 식별자가 다를 경우 Index 이동 비용에 의한 성능이슈 문제가 발생한다.

예를 들어, PK = 1L이고 Client의 식별자가 1AL이라 하자.

해당 데이터를 추출하기 위해 쿼리에서 사용하는 조건은 1AL이 될텐데, 이 식별자가 DB식별자(PK)와 다르므로 DB Query Plan은 Clustered Index가 아닌 Secondary Index를 통해 Using Index Plan을 이용하게 된다.

이로 인해 불필요한 Index 이동 비용이 증가함에 따라, 조회비용이 증가하는 역설적인 상황이 발생한다.

2-2. Unique 문자열/숫자

UUID 및 난수 등을 활용하여 랜덤문자열을 PK채번에 활용하는 전략

  • 기본적으로 난수를 사용하여 생성한 랜덤 문자열을 사용하므로, 키 생성 방식이 간단하지만 랜덤데이터 발생으로 인해 Index 측면에서는 이를 정렬하기 위한 조회성능하락이 발생한다.
  • 또한 정렬된 데이터를 유지해야 하는 Clustered Index 특성상, 정렬비용과 함께, 데이터 삽입 시 필요 인덱스 공간이 가득 찼을 경우 B+ Tree 재구성과 페이지 분할 등의 디스크 I/O가 추가적으로 발생한다.
  • 또한 PK 조회범위를 구성하여도 순차발생이 아닌 난수발생에 의한 문자열이기에, 순차 I/O보다도 더 성능이 안좋은 조회가 발생한다.

3. Unique 정렬 문자열

위에서 기술한 채번방식의 문제점을 보완하여 정렬된 문자열로 PK를 채번하는 전략

  • 분산환경에 대한 PK중복 및 보안문제, 랜덤데이터로 인한 성능 문제를 보완하기 위해 UUID v7나 ULID 알고리즘 등을 활용하여 128bit의 정렬된 문자열을 채번에 활용한다.
  • Clustered/Secondary Index 모두 PK를 소유하고 있으므로 기본적으로 불필요한 조회비용이 발생하지 않아 성능이 좋아질 수 있지만, 문자열 크기가 커질경우 이를 저장하는 Index 입장에서는 그만큼 공간적으로 불리할 수 있다.
  • 데이터가 커질 경우 비교연산에 의한 정렬 및 조회에 비용소모가 발생할 수 있다.

4. Unique 정렬 숫자

Uniqure 정렬 문자열 방식의 공간적 문제를 보완하고자 64bit의 숫자를 이용하는 채번 전략

  • 쉽게 말해서 문자열 대신 숫자를 사용하여 데이터 크기의 이점을 확보하고, 이에 따른 Index 공간을 확보하여 채번하는 방식이다.
  • 단 데이터를 표현하는 공간적 크기가 작아진만큼, TimeStamp 등 (동시성 문제가 발생할 수 있는) 고유성을 확보하지 못한 채번체계가 사용될 경우 단일DB에서도 PK중복현상이 발생할 수 있겠다.

0개의 댓글