460. 단편화 (Fragmentation) - 수평 분할과 수직 분할

⚠️ 이 문서는 하나의 거대한 테이블을 전 세계에 있는 여러 데이터베이스 서버에 나누어 저장(분산 DB)하기 위해, **테이블을 가로(행)로 자르거나 세로(열)로 자르는 물리적인 쪼개기 기술인 '단편화'**를 다룹니다.

핵심 인사이트 (3줄 요약)

  1. 본질: 분산 데이터베이스를 구축하기 위한 첫 번째 단계다. 100만 건의 데이터를 가진 테이블 1개를 10개의 서버에 10만 건씩 쪼개어 저장하는 것이다.
  2. 수평 분할 (Horizontal): 가로줄(행, Row)을 기준으로 쪼갠다. 한국 유저는 한국 서버에, 미국 유저는 미국 서버에 저장하는 가장 직관적인 분할 방식이다. (샤딩 - Sharding)
  3. 수직 분할 (Vertical): 세로줄(열, Column)을 기준으로 쪼갠다. '이름'은 A 서버에, '사진'은 B 서버에 저장한다. 단, 쪼개진 데이터를 나중에 합치려면 반드시 모든 조각에 '기본 키(PK)'가 포함되어야 한다.

Ⅰ. 개요: 코끼리를 냉장고에 넣는 법 (Context & Necessity)

1억 명의 가입자 정보를 하나의 MySQL 서버에 다 담으면 어떻게 될까?

  • 하드디스크가 꽉 찬다.
  • 전 세계에서 날아오는 SELECT 요청 때문에 CPU가 타버린다.

해결책은 1억 명의 데이터를 쪼개서 서버 여러 대에 나눠 담는 것이다. 이것을 분산 데이터베이스 환경의 **'단편화(Fragmentation)'**라고 한다. 단편화의 목적은 "데이터를 가장 많이 사용하는 사람과 물리적으로 가장 가까운 곳에 데이터를 둔다"는 지역성(Locality) 확보에 있다.

📢 섹션 요약 비유: 단편화는 **'거대한 피자 나누어 먹기'**와 같습니다. 한 명이 다 먹기엔 너무 크니까, 피자를 부채꼴 모양으로 쪼개서(수평 분할) 친구들과 나눠 먹거나, 치즈 껍데기만 싹 벗겨서 치즈 좋아하는 친구를 주고 빵만 남겨서(수직 분할) 나눠 먹는 방법이 있습니다.


Ⅱ. 단편화의 2가지 핵심 전략 ★

시험에 100% 나오는 분할 방식이다.

1. 수평 분할 (Horizontal Fragmentation)

  • 자르는 기준: 테이블의 행(Row/Tuple).
  • 예시: WHERE 국가 = '한국'인 데이터 뭉치와 WHERE 국가 = '미국'인 데이터 뭉치로 나눈다.
  • 특징: 스키마(컬럼 구조)는 모든 서버가 완벽하게 똑같다. 들어가는 데이터(내용물)만 다르다.
  • 현대적 용어: 백엔드 개발자들은 이를 **샤딩(Sharding)**이라고 부른다.

2. 수직 분할 (Vertical Fragmentation)

  • 자르는 기준: 테이블의 열(Column/Attribute).
  • 예시: 회원_테이블에서 텍스트 정보(이름, 나이)는 A 서버에 저장하고, 용량이 큰 바이너리 정보(프로필 사진, 음성 파일)는 B 서버에 저장한다.
  • 주의점 (시험 단골): 쪼개진 A 서버의 데이터와 B 서버의 데이터를 나중에 하나로 합치려면(JOIN), 누구의 사진인지 알아야 한다. 따라서 쪼개진 모든 조각에는 반드시 '기본 키(Primary Key)'가 공통으로 포함되어야 한다.

Ⅲ. 단편화의 3대 수학적 규칙 (정당성 조건)

아무렇게나 피자를 자르면 안 된다. 분할된 조각들은 다음 3가지 규칙을 만족해야 원래 테이블로 인정받는다.

  1. 완전성 (Completeness): 쪼개진 조각들을 다 모으면, 원본 테이블의 데이터가 1원 1장도 빠짐없이 100% 다 있어야 한다. (데이터 유실 금지)
  2. 재구성성 (Reconstruction): 쪼개진 조각들을 UNION(수평 분할)이나 JOIN(수직 분할)으로 합쳤을 때, 원본 테이블의 모양과 똑같이 복원될 수 있어야 한다.
  3. 상호 중첩 배제 (Disjointness): 수평 분할을 했을 때, A 조각과 B 조각에 똑같은 데이터가 겹쳐서(중복) 들어가면 안 된다. (교집합이 없어야 함)
┌──────────────────────────────────────────────────────────────┐
│           수평 분할(Horizontal) vs 수직 분할(Vertical) 시각화            │
├──────────────────────────────────────────────────────────────┤
│                                                              │
│ [ 📦 원본 테이블 ]                                              │
│  사번(PK) │ 이름 │ 부서 │ 프로필사진                                │
│ ────────┼────┼────┼────────                                │
│  1001   │ 철수 │ 영업 │ image1.jpg (10MB)                      │
│  1002   │ 영희 │ 개발 │ image2.jpg (12MB)                      │
│                                                              │
│ 1️⃣ [ 수평 분할 (행으로 자름 - 부서 기준) ]                            │
│  A 서버 (영업팀): [ 1001 │ 철수 │ 영업 │ image1.jpg ]               │
│  B 서버 (개발팀): [ 1002 │ 영희 │ 개발 │ image2.jpg ]               │
│                                                              │
│ 2️⃣ [ 수직 분할 (열로 자름 - 데이터 크기 기준) ]                       │
│  A 서버 (텍스트): [ 1001 │ 철수 │ 영업 ] + [ 1002 │ 영희 │ 개발 ]     │
│  B 서버 (이미지): [ 1001 │ image1.jpg ] + [ 1002 │ image2.jpg ]    │
│                 ▲ (중요! 사번(PK)이 양쪽에 다 들어가야 복원 가능!)         │
└──────────────────────────────────────────────────────────────┘

Ⅳ. 결론

"분할의 기준이 분산 시스템의 성능을 결정한다." 단편화는 마법의 지팡이가 아니다. 한국 서버와 미국 서버로 예쁘게 수평 분할을 해놨는데, 사장님이 "전 세계 모든 회원의 평균 나이를 구해와!"라고 쿼리를 던지면, 한국 서버와 미국 서버가 각각 통계를 낸 뒤 네트워크를 타고 바다를 건너와서 데이터를 합쳐야 한다. 단일 서버 시절보다 오히려 100배 느려질 수 있다. 따라서 완벽한 단편화를 위해서는 '사용자들이 주로 어떤 조건(WHERE)으로 검색을 하는가?'를 분석하여, 네트워크를 타지 않고 내 서버 안에서 쿼리가 끝나도록 도메인 단위로 쪼개는 설계 역량이 필수적이다.


📌 관련 개념 맵

  • 관련 이론: 분산 데이터베이스 투명성 (459번 문서 - 사용자는 분할된 사실을 몰라야 함)
  • 동의어: 수평 분할 = Sharding (샤딩), Partitioning (파티셔닝)
  • 결합 방법: 수평 분할의 복원 $\rightarrow$ UNION / 수직 분할의 복원 $\rightarrow$ JOIN
  • 무결성 조건: 완전성, 재구성성, 상호 중첩 배제

👶 어린이를 위한 3줄 비유 설명

  1. 수평 분할은 피자 한 판을 4조각으로 잘라서 4명의 친구가 한 조각씩 나눠 먹는 거예요.
  2. 수직 분할은 피자에서 빵(테두리) 부분만 칼로 동그랗게 잘라내서 한 친구에게 몰아주고, 가운데 토핑 부분만 다른 친구가 먹는 거예요.
  3. 근데 빵이랑 토핑을 나중에 다시 원래 피자 모양으로 합치려면, "이 빵은 저 토핑이랑 세트야!"라고 표시해 두는 이름표(기본 키)가 꼭 양쪽에 다 있어야 한답니다!