새벽 3시에 깨우는 작업
데이터베이스 마이그레이션은 배포가 죽으러 가는 곳이야. 코드는 초 단위로 앞으로 굴러가지만, 스키마는 제거하기 전까지 계속 살아남아. 마이그레이션 순서를 잘못 맞추면 배포 롤백으로도 되돌릴 수 없는 서비스 중단이 발생해.
확장-수축 패턴
옛 코드와 새 코드 둘 다 쓰는 데이터를 다루는 마이그레이션은 이렇게 해:
- 확장 — 새 컬럼, 테이블, 인덱스를 추가해. 옛 코드는 무시하고 새 코드는 바로 사용할 수 있어. 하위 호환성을 유지하지.
- 이주 — 새 구조에 데이터를 백필해. 보통 배포 과정이 아니라 별도의 백그라운드 작업으로 처리해.
- 전환 — 새 구조로 읽고 쓰는 코드를 배포해. 옛 코드도 여전히 작동하도록 허용해.
- 수축 — 모든 코드가 100% 새 구조를 사용하면 (그리고 한 릴리스 주기 동안 유지한 뒤) 옛 컬럼이나 테이블을 삭제해.
마이그레이션 러너 위치
- 배포 전 작업 — 새 코드가 사용자에게 닿기 전에 마이그레이션을 돌려. 추가(확장) 마이그레이션에 안전해.
- 앱 시작 — 코드가 부팅될 때 마이그레이션을 돌려. 위험해: 여러 인스턴스가 동시에 시작되면 경쟁 상태가 발생하고, 콜드 스타트가 길어져.
- 수동 / 필요 시 — 파괴적인 마이그레이션(컬럼 삭제)은 수동 승인 뒤에 통제를 거쳐, 배포와 별도로 실행해.