Skip to content

[BOOK-440/fix] deleted_at 누락 복구 마이그레이션 #135

@move-hoon

Description

@move-hoon

🎟️ 상위 작업 (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]

근본 원인

  1. 최초 마이그레이션 배포 (커밋 6b4c9e8)
  • V20251115_001__add_notification_and_device_tables.sql 생성
  • Production DB에 성공적으로 적용됨
  • 당시 마이그레이션 파일에 deleted_at 컬럼이 포함되어 있지 않았음
  1. Hotfix 커밋 (커밋 4e49126)
  • 이미 배포된 마이그레이션 파일을 직접 수정하여 deleted_at 컬럼 추가
  • Flyway checksum 불일치 발생 (-1671177333 → 89391777)
  • ⚠️ Flyway Best Practice 위반: 이미 실행된 마이그레이션은 절대 수정하면 안 됨
  1. 배포 시도 (v1.1.1)
  • Flyway: "Migration checksum mismatch" 에러
  • Manual repair로 checksum 업데이트
  • 하지만 CREATE TABLE은 이미 실행되었으므로 재실행되지 않음
  • Production DB에는 여전히 deleted_at 컬럼이 없는 상태
  1. 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 실패

재현 단계

  1. Production DB 상태 확인:
    DESC device; -- deleted_at 컬럼 없음
    DESC notification; -- deleted_at 컬럼 없음

  2. Flyway 히스토리 확인:
    SELECT * FROM flyway_schema_history WHERE version = '20251115.001';
    -- checksum: 89391777, success: 1 (성공으로 기록됨)

  3. 애플리케이션 시작:
    [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

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions