새벽 3시에 깨우는 job
DB migration 은 deploy 가 죽으러 가는 곳이야. 코드는 초 단위로 앞으로 굴러; schema 는 제거할 때까지 살아. Migration 순서 틀리면 deploy rollback 으로 되돌릴 수 없는 outage.
Expand-and-contract 패턴
옛 + 새 코드 둘 다 쓰는 데이터 만지는 migration:
- Expand — 새 column / table / index 추가. 옛 코드 무시; 새 코드 사용 가능. 하위 호환.
- Migrate — 새 구조에 데이터 backfill. 보통 deploy 가 아니라 별도 백그라운드 job.
- Switch — 새 구조 read/write 코드 deploy. 옛 코드 여전히 허용.
- Contract — 100% 코드가 새 구조 사용하면 (그리고 한 release cycle 유지) 옛 column / table 삭제.
Migration runner 위치
- Pre-deploy job — 새 코드가 사용자 닿기 전 migration. 추가 (expand) migration 에 안전.
- App startup — 코드가 boot 에 migration. 위험: 여러 인스턴스 동시 시작 시 race condition, cold-start 길어짐.
- 수동 / on-demand — 파괴적 migration (column drop) 은 수동 승인 뒤에 gate, deploy 와 별도 실행.