hotfix: 운영 notification FCM 컬럼 누락 복구 (main)#2310
Conversation
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
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. Comment |
Soundbar91
left a comment
There was a problem hiding this comment.
236이랑 쿼리 내용이 완전 다른데, 이렇게 하신 이유가 있으실까요
There was a problem hiding this comment.
내부 쿼리의 문법은 처음보는데, 자세한 설명이 없으면 이해하기 어려울 거 같습니다. 제 개인적인 경험으로 동적 SQL은 학부에서 배웠던 기억도 없고, 저희 코인에서도 SQL 상으로는 다루지 않았기 때문입니다.- 테스트 코드가 필요한지가 의문입니다. 테스트 코드는 해당 PR 이후에도 계속 돌아가는데, 그 과정에서 현재 작성한 테스트 코드가 운영 상 필요한 테스트 코드인지 궁금합니다.
- 지금 상황은 flyway를 적용하지 않고, 프로덕션 DB에 V236를 직접 적용해도 괜찮을 거 같습니다. 스테이지에는 이미 적용된 컬럼이기도 하고, 프로덕션 DB에 직접 적용한다고 해서 큰 문제는 없을 거 같아요. 다른 개발자 로컬 PC에서는 V236이 적용된지 꽤 됐기 때문에 큰 문제는 없을 거 같습니다.
|
@Soundbar91 검토해 주셔서 감사합니다. 말씀해 주신 대로 repeatable migration과 테스트는 반영하지 않고 production DB의 컬럼 상태를 확인한 뒤 기존 V236 SQL을 직접 적용하는 방향으로 진행하겠습니다. |
⚡ 간단 요약
V236적용 후 baseline으로 전환됐지만, production은V236없이 baseline으로 전환되어notification의 FCM 컬럼 3개가 누락됐고 애플리케이션이 기동하지 못했습니다.🔍 문제 발생 배경
notification테이블에 다음 컬럼을 추가하는V236migration이 반영되었습니다.is_push_successfcm_error_codefcm_messaging_error_codeV1__baseline_schema.sql을 생성하고 기존 V1–V236 migration을 실행 경로에서 제외했습니다. 따라서 새 V1 파일에는 세 컬럼이 포함되어 있지만, production의 실제 테이블에는 아직 존재하지 않는 상태가 됐습니다.missing column [fcm_error_code] in table [notification]오류로 기동에 실패했습니다.🚨 원인 정리
이 문제는 V1 baseline 파일의 컬럼 정의가 잘못된 것이 아니라, baseline 생성 기준이었던 stage와 전환 대상인 production의 migration 적용 상태가 달랐던 것이 원인입니다.
baseline-on-migrate=true에 의해 V1 SQL은 실행되지 않음따라서 현재 필요한 작업은 새로운 기능을 위한 스키마 변경이 아니라, production 스키마를 이미 선언된 V1 baseline 상태와 일치시키는 복구 작업입니다.
🧭 해결 방법 검토
V236을 다시 migration 경로에 추가V5versioned migration 추가outOfOrder=true로 낮은 버전 실행 허용현재 분리된 migration 이력을 변경하지 않으면서 모든 환경에서 같은 파일을 안전하게 실행할 수 있다는 점에서 repeatable migration이 가장 영향 범위가 작고 재현 가능한 방법이라고 판단했습니다.
✅ 선택한 해결 방법
R__ensure_notification_fcm_columns.sql을 추가합니다.information_schema.COLUMNS에서 필요한 세 컬럼의 존재 여부를 확인합니다.ALTER TABLE ... ALGORITHM=INSTANT로 추가합니다.DO 0으로 종료합니다.ALGORITHM=INSTANT를 명시해 MySQL이 테이블 복사 방식으로 자동 전환하지 않고, instant ADD COLUMN을 지원하지 않는 조건에서는 즉시 실패하도록 했습니다. 세 컬럼은 모두 nullable이므로 기존 운영 애플리케이션과도 하위 호환됩니다.🌍 환경별 동작
🧪 검증
MySQL 8.0.29와 실제 사용 중인 Flyway 9.16.3 조합으로 다음을 검증했습니다.
migrate()실행 시 중복 적용 없음flyway_schema_history기록 확인검증 명령:
./gradlew test --tests in.koreatech.koin.acceptance.migration.NotificationFcmMigrationTest./gradlew build./gradlew test --tests in.koreatech.koin.acceptance.migration.NotificationFcmMigrationTest --tests in.koreatech.koin.acceptance.migration.DepartmentContactMigrationTest./gradlew buildGitHub build, Flyway version 검사, 위험 SQL 검사, PR 제목 검사도 모두 통과했습니다.
🛡️ 배포 전 확인 사항
flyway_schema_history가 V1 BASELINE 상태인지 확인합니다.notification의 세 FCM 컬럼이 실제로 누락됐는지 확인합니다.✅ Checklist (완료 조건)