피드로 돌아가기
Dev.toDatabase
원문 읽기
SQLite 제약으로 인한 D1 장애 해결을 위한 Expand-Contract 패턴 적용
The NOT NULL trap that killed my Cloudflare Worker at 2:47am
AI 요약
Context
Cloudflare D1(SQLite 기반)의 제한적인 ALTER TABLE 기능으로 인한 스키마 변경 제약 발생. 기존 데이터가 존재하는 상태에서 DEFAULT 값 없는 NOT NULL 컬럼 추가 시 마이그레이션 실패 및 서비스 500 에러 유발.
Technical Solution
- DEFAULT 값을 동반한 NOT NULL 컬럼 추가로 기존 행의 제약 조건 위반 방지
- 세밀한 데이터 모델링 필요 시 Nullable 컬럼 선행 생성 후 제약 조건 강화 전략 채택
- 타입 변경 및 컬럼 삭제를 위한 신규 테이블 생성 기반 Expand-Contract 패턴 도입
- 신규 테이블로의 데이터 복제 후 기존 테이블 삭제 및 리네임을 통한 무중단 스키마 변경 구현
- wrangler d1 migrations apply --local 명령어를 통한 로컬 환경 사전 검증 프로세스 구축
- PRAGMA table_info 활용으로 마이그레이션 직후 컬럼 상태의 정밀 검증 수행
실천 포인트
1. D1/SQLite 환경에서 NOT NULL 컬럼 추가 시 반드시 DEFAULT 값 설정 여부 확인
2. 단순 추가 외 스키마 변경 시 '신규 테이블 생성 -> 데이터 이전 -> 교체' 순의 Expand-Contract 패턴 적용
3. 운영 환경 반영 전 로컬 마이그레이션 실행 및 PRAGMA 명령어를 통한 스키마 상태 검증
4. 마이그레이션 이력을 단순 번호 기반의 Flat File로 관리하여 추적 가능성 확보