Skip to content

[Fix] V12 vision_summary_5s 재생성 마이그레이션이 신규 환경에서 실패하지 않도록 수정#66

Merged
LeeJeongHeon02 merged 1 commit into
devfrom
fix/vision-summary-5s-fresh-bootstrap
Jul 21, 2026
Merged

[Fix] V12 vision_summary_5s 재생성 마이그레이션이 신규 환경에서 실패하지 않도록 수정#66
LeeJeongHeon02 merged 1 commit into
devfrom
fix/vision-summary-5s-fresh-bootstrap

Conversation

@LeeJeongHeon02

@LeeJeongHeon02 LeeJeongHeon02 commented Jul 21, 2026

Copy link
Copy Markdown
Contributor

요약

  • V12__recreate_vision_summary_5s.sql은 운영 DB에서 vision_summary_5s 테이블이 실수로 DROP된 사고를 복구하기 위해 작성된 마이그레이션으로, 조건 없이 CREATE TABLE을 실행한다.
  • V1부터 전체 이력을 처음부터 적용하는 환경(신규 스테이징, MySQL 기반 로컬 셋업, 마이그레이션만으로 하는 DR 복구 등)에서는 V1이 이미 이 테이블을 만들어두는데 그 환경에서는 아무도 지운 적이 없어서, V12에서 ERROR 1050 (42S01): Table 'vision_summary_5s' already exists로 실패한다.
  • 실제 mysql:8.0.46 컨테이너로 확인한 결과 V12의 컬럼/제약조건/인덱스 목록이 V1 + V4가 이미 만들어내는 스키마와 완전히 동일함을 확인했다. 그래서 V12가 vision_summary_5s가 실제로 없을 때만 DDL을 실행하도록 가드를 추가했다(information_schema로 존재 여부 확인 + PREPARE/EXECUTE로 조건부 실행 — MySQL은 CREATE INDEXIF NOT EXISTS를 지원하지 않아 CREATE TABLE IF NOT EXISTS만으로는 부족함).
  • 두 시나리오 모두 동일한 최종 스키마로 수렴함을 확인했다: 신규 부트스트랩(V1→V13을 빈 DB에 적용)과 원래 사고 복구 경로(V1~V11 적용 후 수동 DROP, 이후 V12 적용).

⚠️ 배포 시 주의

이 변경은 운영에 이미 적용된 마이그레이션의 파일 내용을 바꾸기 때문에 Flyway checksum도 함께 바뀐다. 배포 전에 운영 DB에 flyway repair(또는 flyway_schema_historyversion = 12 행 checksum 수동 갱신)를 먼저 실행해야 한다 — 안 하면 다음 앱 기동 시 Flyway checksum 검증에서 실패해 앱이 뜨지 않는다. README의 DB 마이그레이션 섹션과 마이그레이션 파일 헤더에 이 내용을 문서화해뒀다.

이 PR과 관련된 운영 repair는 이미 완료됨 — 운영 DB의 V12 checksum을 679019731057297317로 직접 갱신하고 확인까지 마쳤다.

테스트

  • 원본 버그 재현: 수정 전 V1~V12를 빈 mysql:8.0.46 컨테이너에 순서대로 적용 → ERROR 1050 (42S01) at line 12: Table 'vision_summary_5s' already exists로 실패 확인.
  • V1 + V4가 만드는 최종 스키마가 V12의 CREATE TABLE 정의와 컬럼/제약조건/인덱스까지 동일함을 SHOW CREATE TABLE로 대조 확인.
  • 신규 부트스트랩: 수정된 V12를 포함해 V1V13을 빈 DB에 적용 → 성공, 가드가 스킵되고 스키마 그대로 유지.
  • 사고 복구: V1~V11 적용 후 수동으로 DROP TABLE vision_summary_5s 실행, 이후 수정된 V12 적용 → 테이블 정상 재생성.
  • 두 시나리오의 최종 스키마(SHOW CREATE TABLE)를 diff → 완전히 동일.
  • 실제 Flyway 11 CLI로 V1~V13 전체 마이그레이션을 처음부터 실행 → 성공, checksum 값 확인.
  • ./gradlew testBUILD SUCCESSFUL.

🤖 Generated with Claude Code

…otstrap

V12 was written to recover from a real prod incident where the table was
manually DROPped, so it always ran a plain CREATE TABLE. Any environment
that applies V1-V12 from scratch (new staging, MySQL-backed local setup,
migration-only DR rebuild) hits "Table already exists" at V12 because V1
already creates the same table and nothing ever dropped it there.

Confirmed with mysql:8.0.46 that V12's column/constraint/index list is
byte-identical to what V1 + V4 already produce, so V12 now only runs its
DDL when vision_summary_5s is actually missing (checked via
information_schema + PREPARE/EXECUTE, since MySQL has no IF NOT EXISTS
for CREATE INDEX). Verified both the fresh-bootstrap path and the
original incident-recovery path (V1-V11, manual DROP, then V12) converge
on an identical schema.

Since this changes the checksum of a migration already applied in prod,
the README's DB 마이그레이션 section now documents that prod needs a
`flyway repair` before the next deploy.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Jul 21, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

V12 마이그레이션이 기존 vision_summary_5s 테이블과 인덱스를 조건부로 처리하도록 변경됐다. README에는 Flyway 버전 범위, 실제 MySQL 검증 절차, 운영 마이그레이션 파일의 체크섬 관리 규칙이 추가됐다.

Changes

Flyway 마이그레이션 업데이트

Layer / File(s) Summary
V12 조건부 DDL 실행
src/main/resources/db/migration/V12__recreate_vision_summary_5s.sql
information_schema.tables로 테이블 존재 여부를 확인하고, 테이블과 두 인덱스의 생성을 PREPARE/EXECUTE 기반으로 조건부 실행한다.
Flyway 운영 검증 절차
README.md
운영 스키마 범위를 V1~V13으로 갱신하고, 실제 MySQL에서 전체 마이그레이션을 검증하는 절차와 체크섬 변경 시 flyway repair를 수행하는 규칙을 문서화했다.

Estimated code review effort: 2 (Simple) | ~15 minutes

Possibly related PRs

  • Shinhan-KLLJS/backend#53: 동일한 V12 마이그레이션의 vision_summary_5s 테이블 재생성 동작을 수정한다.
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed 제목이 V12 vision_summary_5s 재생성 마이그레이션이 신규 환경에서 실패하지 않도록 한 핵심 변경을 명확히 요약합니다.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/vision-summary-5s-fresh-bootstrap

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@LeeJeongHeon02 LeeJeongHeon02 changed the title fix(migration): guard V12 vision_summary_5s recreate against fresh bootstrap fix(migration): V12 vision_summary_5s 재생성 마이그레이션이 신규 환경에서 실패하지 않도록 수정 Jul 21, 2026
@LeeJeongHeon02 LeeJeongHeon02 self-assigned this Jul 21, 2026
@LeeJeongHeon02 LeeJeongHeon02 changed the title fix(migration): V12 vision_summary_5s 재생성 마이그레이션이 신규 환경에서 실패하지 않도록 수정 [Fix] V12 vision_summary_5s 재생성 마이그레이션이 신규 환경에서 실패하지 않도록 수정 Jul 21, 2026
@LeeJeongHeon02
LeeJeongHeon02 merged commit a5f997c into dev Jul 21, 2026
2 checks passed
@LeeJeongHeon02
LeeJeongHeon02 deleted the fix/vision-summary-5s-fresh-bootstrap branch July 21, 2026 16:32
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant