마이그레이션이 스키마의 source of truth
마이그레이션 = 스키마의 versioned, reproducible 변경. repo 의 20260503_add_user_avatar.sql. dev 에 한 번, staging 에 한 번, prod 에 한 번 실행 — 같은 변경, 같은 순서, 모든 환경.
필수 룰
- 모든 스키마 변경이 마이그레이션. "prod 에 ALTER 직접 실행" 없음. 그게 reproducibility 체인 영원히 깨뜨림.
- Ship 후 마이그레이션은 불변. 이미 prod 에 실행된 마이그레이션 수정 필요하면 새 마이그레이션 작성. 적용된 마이그레이션 절대 편집 금지.
- 마이그레이션 forward 와 back 둘 다 테스트. 대부분 도구가
down()방향 지원. dev 에서 사용; prod 엔 forward-only 신뢰. - Destructive 마이그레이션은 multi-step. 컬럼 이름 변경 = (1) 새 컬럼 추가, (2) 백필, (3) 둘 다에 쓰기 시작, (4) read 전환, (5) 옛 컬럼 drop. 배포 가로질러.
도구 zoo
Alembic (Python/SQLAlchemy), Flyway (JVM, 언어 무관), goose (Go), Prisma Migrate (Node/TypeScript), supabase migration / db push (Supabase), graphile-migrate (Postgres-native). repo 당 하나, 절대 둘 안 됨.