-
Notifications
You must be signed in to change notification settings - Fork 1
Closed
Labels
Description
🎟️ 상위 작업 (Ticket Number)
BOOK-438
🐞 버그 설명
문제 설명
Production 환경에서 v1.1.1 배포 시 애플리케이션 시작 실패
Schema-validation: missing column [deleted_at] in table [device]
Schema-validation: missing column [deleted_at] in table [notification]
근본 원인
- 최초 마이그레이션 배포 (커밋 6b4c9e8)
- V20251115_001__add_notification_and_device_tables.sql 생성
- Production DB에 성공적으로 적용됨
- 당시 마이그레이션 파일에 deleted_at 컬럼이 포함되어 있지 않았음
- Hotfix 커밋 (커밋 4e49126)
- 이미 배포된 마이그레이션 파일을 직접 수정하여 deleted_at 컬럼 추가
- Flyway checksum 불일치 발생 (-1671177333 → 89391777)
⚠️ Flyway Best Practice 위반: 이미 실행된 마이그레이션은 절대 수정하면 안 됨
- 배포 시도 (v1.1.1)
- Flyway: "Migration checksum mismatch" 에러
- Manual repair로 checksum 업데이트
- 하지만 CREATE TABLE은 이미 실행되었으므로 재실행되지 않음
- Production DB에는 여전히 deleted_at 컬럼이 없는 상태
- Entity vs DB 불일치
- Entity: BaseTimeEntity에 deleted_at 정의됨 ✅
- Migration: V20251115_001에 deleted_at 정의됨 ✅
- Production DB: deleted_at 컬럼 없음 ❌
- Hibernate schema validation 실패
타임라인
[6b4c9e8] feat: device, notification 테이블 추가
↓ (deleted_at 없는 버전이 Production DB에 적용됨)
[4e49126] hotfix: deleted_at 필드 추가
↓ (이미 실행된 마이그레이션 파일 수정 - ❌ Anti-pattern)
[v1.1.1] 배포 시도
↓ (Flyway checksum 불일치)
↓ (Repair로 checksum만 수정)
↓ (실제 DB는 변경되지 않음)
↓
❌ Schema validation 실패
재현 단계
-
Production DB 상태 확인:
DESC device; -- deleted_at 컬럼 없음
DESC notification; -- deleted_at 컬럼 없음 -
Flyway 히스토리 확인:
SELECT * FROM flyway_schema_history WHERE version = '20251115.001';
-- checksum: 89391777, success: 1 (성공으로 기록됨) -
애플리케이션 시작:
[PersistenceUnit: default] Unable to build Hibernate SessionFactory
Schema-validation: missing column [deleted_at] in table [device]
영향 범위
- ✅ Dev 환경: 정상 (clean DB에서 마이그레이션 적용)
- ❌ Production: 배포 실패
- ✅ Entity 코드: 문제 없음 (BaseTimeEntity에 정의됨)
근본 문제
Flyway의 Immutability 원칙 위반:
- Flyway는 이미 실행된 마이그레이션의 checksum을 저장
- 파일 수정 시 checksum 불일치로 배포 차단
- Repair는 임시 방편일 뿐, 실제 DB는 변경되지 않음
🔧 수정할 작업 목록
- deleted_at 누락 복구 마이그레이션
🔗 참고 링크
No response