Repository navigation
fix: 외래키로 인해 물리적 탈퇴가 되지 않는 문제 수정 - #848
Conversation
탈퇴 후 30일이 지난 사용자를 삭제하는 스케줄러가 외래키 제약에 걸려 매일 롤백되고 있었다. 삭제 목록에서 빠져 있던 데이터를 채우고 순서를 바로잡는다. - 1:1 채팅방은 참여자가 사라지면 유지될 수 없으므로 방 전체를 삭제한다 - 채팅방이 멘토링을 참조하므로 멘토링보다 먼저 삭제한다 - 멘토로 참여한 멘토링과 탈퇴자가 쓴 뉴스의 좋아요를 함께 삭제한다 - 신고로 가려진 게시글과 메시지는 조회 필터에 걸리므로 플래그를 되돌린 뒤 삭제한다 - 정지 기록은 대상 행만 삭제하고, 집행자 참조는 해제해 다른 사용자의 이력을 보존한다 - 프로필 이미지 key 가 비어 있으면 S3 호출을 건너뛴다 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info
Walkthrough
Priority: ⬆️ High Estimated code review effort: 3 (Moderate) | ~25 minutes Severity of issue fixed: High Merge Risk: ⚪ Minimal · up to
|
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 6a430c8465
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
기존에는 탈퇴자가 속한 채팅방이면 1:1 과 그룹을 구분하지 않고 방 전체를 삭제했다. 그룹 채팅방을 만드는 경로가 아직 없어 영향은 없었지만, 그룹 채팅이 도입되면 멤버 한 명의 탈퇴로 남은 멤버들의 대화가 통째로 사라진다. - 1:1 채팅방은 참여자가 사라지면 유지될 수 없으므로 방 전체를 삭제한다 - 그룹 채팅방은 탈퇴자의 메시지, 읽음 상태, 참여자 행만 삭제하고 방은 유지한다 그룹방을 삭제 대상에서 제외하기만 하면 탈퇴자의 참여자 행이 남아 site_user 삭제가 다시 외래키에 막히므로, 참여 기록은 반드시 정리해야 한다. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
banned_by 를 nullable 로 바꾸는 변경이므로, 애노테이션 기본값에 기대지 않고 매핑에 계약을 드러낸다. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 87b90f7c07
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
기존에는 탈퇴자가 접수한 신고를 삭제하고, 탈퇴자가 신고당한 기록은 남겼다. 신고 한 건의 주인은 신고당한 사람이므로 방향이 반대였다. - 탈퇴자를 대상으로 한 신고는 탈퇴자의 이력이므로 삭제한다 - 탈퇴자가 접수한 신고는 신고당한 사용자의 이력이므로 신고자 참조만 해제하고 보존한다 기존 동작에서는 누군가를 신고한 뒤 탈퇴하면 그 신고가 관리자 화면의 피신고 이력에서 함께 사라졌다. 정지 기록과 같은 기준으로 맞춘다. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…e-withdrawal-logic
develop 에 V60 이 추가되어 번호가 겹치므로 한 칸씩 밀어준다. - V60__alter_user_ban_banned_by_nullable.sql -> V61 - V61__alter_report_reporter_id_nullable.sql -> V62 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
관련 이슈
작업 내용
탈퇴 후 30일이 지난 사용자를 삭제하는
UserRemovalScheduler가 외래키 제약으로 인해 매일 밤 롤백되고 있었습니다.채팅
메시지 → 읽음 상태 → 참여자(양쪽) → 방 순으로 정리합니다.
삭제하고 방은 남깁니다. 그룹방을 만드는 경로는 아직 없지만, 도입 시 한 명의 탈퇴로 남은 멤버의
대화가 사라지는 회귀를 막기 위해 분기해 두었습니다.
멘토링
뉴스
게시글·채팅 메시지의 소프트 삭제
is_deleted = true) 게시글과 메시지는 엔티티 조회 필터에 걸려삭제되지 않았습니다. 플래그를 되돌린 뒤 삭제해 JPA cascade가 그대로 동작하게 했습니다.
정지 기록
이를 위해
user_ban.banned_by를 nullable로 변경했습니다. (V61)신고 기록
정지 기록과 같은 기준입니다. 이를 위해
report.reporter_id를 nullable로 변경했습니다. (V62)사라졌습니다.
프로필 이미지
S3Service.deleteExProfile이 빈 key로 S3를 호출해 예외를 던지던 문제를 막았습니다.profile_image_url이 null이거나 빈 문자열인 계정에서 발생합니다.특이 사항
V61(user_ban.banned_bynullable),V62(report.reporter_idnullable).상대방의 채팅방 목록 조회가
CHAT_PARTNER_NOT_FOUND로 전체 실패하기 때문에, 방을 남기는선택지가 사실상 없었습니다.
ddl-auto=create로 스키마를 만들어운영 외래키가 생성되지 않으므로 이 결함을 재현할 수 없습니다. 검증은 실제 마이그레이션을 적용한
로컬 MySQL에서 수동으로 했습니다. (1:1·그룹 채팅방 분기, 신고 기록 양방향 처리 포함)
리뷰 요구사항 (선택)
chat_message.sender_id를 nullable로 바꿔익명화하는 것인데, 조회 로직 재작업이 필요하고 탈퇴자의 메시지를 영구 보관하게 됩니다.
이 논의는 feat: 탈퇴자의 채팅 메시지를 삭제 대신 "(알 수 없음)"으로 표기 #849 로 분리했습니다.
user_ban과report의 집행자·신고자 참조를 NULL로 두는 방식이 적절한지 봐주세요.외래키를 제거해 원래 id를 남기는 선택지도 있습니다.
report.reported_id의 엔티티-스키마 불일치 (엔티티는nullable = false,V40은 nullable).기존 NULL 행 백필 판단이 필요해 이번 범위에서 제외했습니다.