Expand and Contract

스키마를 한 번에 갈아끼우지 않고, 공존 구간을 만들어 바꿉니다.

위험을 낮추는 핵심은 새 구조를 먼저 넓혀 두고, 데이터와 애플리케이션을 천천히 옮긴 뒤, 더 이상 쓰지 않는 구조만 마지막에 제거하는 것입니다.

1. Expand

새 구조를 먼저 추가

기존 앱은 그대로 두고 새 컬럼을 NULL 허용으로 추가합니다.

ADD full_name 기존 name 유지
구버전 안전
2. Backfill + Sync

두 경로의 값을 맞춤

기존 데이터를 채우고, 전환 기간에는 앱의 dual-write나 동기화 잡으로 두 컬럼을 맞춥니다.

full_name = name dual write
롤백 쉬움
3. Switch

애플리케이션 기준 전환

읽기와 쓰기를 새 컬럼으로 옮기되, 옛 컬럼은 아직 남겨둡니다.

read full_name write full_name
혼합 배포 대응
4. Contract

옛 구조를 마지막에 제거

로그와 코드 의존성이 사라진 것을 확인한 뒤 name 컬럼을 삭제합니다.

DROP name 제약/인덱스 정리
되돌리기 어려움

성공 조건은 단계별 호환성입니다

각 단계에서 구버전과 신버전 앱이 잠시 함께 떠도 같은 데이터를 읽고 써야 합니다. DDL 락과 재작성 여부는 DBMS별로 따로 확인합니다.

배포 순서

DB 확장 → 앱 전환 → DB 축소

축소는 가장 마지막입니다. 먼저 제거하면 구버전 앱이 즉시 깨집니다.

검증

백필 완료와 값 차이 확인

두 컬럼이 공존하는 동안 누락, 지연, 불일치를 계속 검사합니다.

롤백

Contract 전까지 되돌릴 길을 남김

옛 컬럼이 남아 있으면 앱 배포 실패 시 이전 경로로 되돌리기 쉽습니다.