샤딩과 파티셔닝 (Sharding vs Partitioning)
한눈에 보기
파티셔닝과 샤딩의 분산 범위와 목적을 비교한다. 수평·수직 분할, 샤드 키 선택, 핫스팟과 리밸런싱, 크로스 샤드 쿼리의 비용을 정리했다.
최종 업데이트 2026.09.17
파티셔닝(Partitioning)은 큰 테이블을 규칙에 따라 여러 조각으로 나누어 저장하는 기법이고, 샤딩(Sharding)은 그 조각들을 서로 다른 데이터베이스 서버에 분산해 두는 기법이다. 파티셔닝이 한 서버 안에서 관리 효율과 쿼리 성능을 높이는 수단이라면, 샤딩은 한 서버의 한계를 넘어 쓰기 처리량과 저장 용량 자체를 수평 확장하는 수단이다. 샤딩은 강력하지만 샤드 키 선택, 리밸런싱, 크로스 샤드 쿼리라는 비용을 함께 치러야 한다.
수평 분할과 수직 분할
데이터를 나누는 방향은 두 가지다. 수평 분할(horizontal partitioning)은 행(row)을 기준으로 나눈다. 예를 들어 주문 테이블을 주문 일자별로, 혹은 사용자 ID 범위별로 나누면 각 조각은 스키마가 같고 담긴 행만 다르다. 수직 분할(vertical partitioning)은 열(column)을 기준으로 나눈다. 자주 조회하는 열과 크고 드물게 쓰는 열(본문, 이미지 메타데이터 등)을 다른 테이블로 분리하는 식이다. 흔히 말하는 샤딩은 수평 분할을 여러 서버로 확장한 것이고, 마이크로서비스에서 도메인별로 데이터베이스를 분리하는 것은 수직 분할을 서버 단위로 확장한 것에 가깝다.
파티셔닝과 샤딩 비교
| 구분 | 파티셔닝 | 샤딩 |
|---|---|---|
| 분산 범위 | 한 데이터베이스 서버 내부 | 여러 데이터베이스 서버 |
| 주된 목적 | 관리 효율, 파티션 프루닝으로 조회 최적화 | 쓰기 처리량과 용량의 수평 확장 |
| 라우팅 주체 | 데이터베이스가 자동 처리 | 애플리케이션이나 미들웨어가 담당 |
| 트랜잭션과 조인 | 서버 내부라 대체로 자유롭다 | 샤드를 넘는 순간 크게 제약된다 |
| 대표 예 | 로그 테이블의 월별 파티션 | 사용자 ID 해시로 나눈 N대의 DB |
파티셔닝의 대표 효과는 파티션 프루닝(partition pruning)이다. 월별로 나눈 로그 테이블에서 특정 월을 조회하면 데이터베이스가 해당 파티션만 읽는다. 오래된 데이터 삭제도 파티션 하나를 통째로 제거하면 되므로 대량 DELETE보다 훨씬 가볍다. 반면 샤딩은 하드웨어 한 대의 물리적 한계를 넘는 유일한 수평 확장 수단이지만, 데이터베이스가 제공하던 편의를 애플리케이션이 떠안게 된다.
샤드 키 선택이 성패를 가른다
샤드 키(shard key)는 어떤 행이 어느 샤드에 갈지 정하는 기준 열이다. 좋은 샤드 키의 조건은 두 가지다. 첫째, 데이터와 트래픽이 샤드들에 고르게 퍼져야 한다. 특정 값에 트래픽이 몰리면 그 샤드만 뜨거워지는 핫스팟(hotspot)이 생긴다. 둘째, 주요 쿼리가 샤드 키를 조건에 포함해 한 샤드만으로 처리되어야 한다. 분배 방식은 크게 세 가지다.
- 해시 기반. 키의 해시값으로 샤드를 정한다. 분포는 고르지만 범위 조회가 모든 샤드로 흩어진다.
- 범위 기반. 키 구간별로 샤드를 정한다. 범위 조회에 유리하지만 최신 데이터에 쓰기가 몰리는 핫스팟이 생기기 쉽다.
- 디렉터리 기반. 키와 샤드의 매핑 테이블을 따로 둔다. 유연하지만 매핑 저장소가 단일 장애점이 될 수 있다.
예를 들어 사용자 중심 서비스라면 user_id를 해시하는 선택이 무난하다. 한 사용자의 주문, 프로필, 활동이 같은 샤드에 모여 대부분의 요청이 샤드 하나로 끝나기 때문이다. 반대로 생성 시각을 샤드 키로 잡으면 모든 신규 쓰기가 마지막 샤드에 몰리는 전형적인 실패 사례가 된다.
리밸런싱과 크로스 샤드 쿼리 문제
샤딩의 진짜 어려움은 운영에서 드러난다. 먼저 리밸런싱(rebalancing) 문제다. 샤드를 4대에서 5대로 늘릴 때 샤드 번호를 hash(key) % 4로 계산했다면 나머지 연산의 기준이 바뀌어 거의 모든 데이터가 이동 대상이 된다. 그래서 실무에서는 이동량을 최소화하는 일관 해싱(consistent hashing)을 쓰거나, 처음부터 물리 샤드 수보다 훨씬 많은 논리 샤드(가상 버킷)를 만들어 두고 논리 샤드 단위로 서버에 배치하는 방식을 쓴다. 서버 증설 시 논리 샤드 몇 개만 옮기면 되기 때문이다.
다음은 크로스 샤드 쿼리(cross-shard query) 문제다. 샤드 키가 조건에 없는 조회는 모든 샤드에 쿼리를 뿌리고 결과를 애플리케이션에서 합쳐야 한다. 이런 스캐터 개더(scatter-gather) 방식은 가장 느린 샤드가 전체 응답 시간을 결정하고, 정렬과 페이징도 직접 병합해야 한다. 서로 다른 샤드에 걸친 조인은 사실상 포기하고 데이터를 미리 비정규화해 두는 경우가 많다. 여러 샤드에 걸친 쓰기는 단일 트랜잭션으로 묶을 수 없어 2단계 커밋(two-phase commit)이나 사가(saga) 패턴 같은 분산 트랜잭션 기법이 필요해진다. 이런 비용 때문에 샤딩은 인덱스 튜닝, 캐시, 레플리케이션, 파티셔닝을 모두 검토한 뒤에 꺼내는 마지막 카드로 여겨진다.
면접에서 이렇게 물어본다
- 파티셔닝과 샤딩의 차이를 목적과 분산 범위 관점에서 설명해 보라.
- 샤드 키를 잘못 선택하면 어떤 문제가 생기는지 핫스팟 사례를 들어 설명해 보라.
- 샤드를 증설할 때 데이터 대이동을 피하는 방법에는 무엇이 있는가.
- 샤드 키가 조건에 없는 조회와 여러 샤드에 걸친 트랜잭션은 어떻게 처리하는가.
- 서비스가 커질 때 샤딩 도입 전에 먼저 시도해야 할 대안들을 순서대로 말해 보라.
데이터베이스에서 같이 읽기
- 이상 현상 (Anomaly)이상 현상은 테이블 설계가 잘못되어 삽입, 갱신, 삭제 과정에서 데이터 불일치나 손실이 생기는 현상이다. 삽입, 갱신, 삭제 이상의 세 종류와 원인인 함수 종속, 해결책인 정규화까지 예시와 함께 정리한다.
- 데이터베이스 커넥션 풀 (Database Connection Pool)데이터베이스 연결을 미리 만들어 재사용하는 커넥션 풀의 동작 원리와 필요성을 다룬다. HikariCP 설정, 풀 크기 계산, 타임아웃과 고갈 문제를 실무 관점에서 정리했다.
- 인덱스 (Index)인덱스는 컬럼 값과 저장 위치를 별도 자료구조로 정리해 검색 속도를 높이는 장치다. B+Tree 동작 원리, 클러스터드와 논클러스터드 비교, 복합 인덱스와 커버링 인덱스, 설계 시 주의점을 다룬다.
- 데이터베이스 레플리케이션 (Database Replication)원본 데이터베이스의 변경을 레플리카에 복제해 읽기 부하와 장애를 분산하는 구조를 다룬다. 동기와 비동기 복제, 복제 지연, 읽기 일관성과 장애 전환을 정리했다.
이 개념, 내 코드에서는 어떻게 물어볼까요
데브핏(DevFit)에 채용공고 URL을 붙여 넣고 레포지토리를 연결하면, 내가 쓴 커밋에서 예상 질문과 어필 포인트를 만듭니다. 하루 10회까지 무료입니다. 합불 판정이나 지원자 랭킹은 만들지 않고, 최종 판단은 사람이 합니다.
공고 넣고 시작하기