Skip to content

#483 [Fix] 로컬 draft→S3 promote가 DB 트랜잭션과 분리되어 orphan 파일/유실 위험 - #484

Merged
si-zero merged 5 commits into
devfrom
fix/#483
Sep 12, 2026
Merged

#483 [Fix] 로컬 draft→S3 promote가 DB 트랜잭션과 분리되어 orphan 파일/유실 위험#484
si-zero merged 5 commits into
devfrom
fix/#483

Conversation

@si-zero

@si-zero si-zero commented Sep 12, 2026

Copy link
Copy Markdown
Member

#️⃣ 연관된 이슈

📝 작업 내용

🐛 Fix

내용 파일
로컬 draft → S3 key 계산(부수효과 없음)과 실제 업로드+로컬 삭제를 분리 LocalDraftFileStorageService.java
실제 승격(업로드/삭제)을 DB 트랜잭션 커밋 이후로 미루도록 수정 (기존 afterCommit 패턴 재사용) BattleServiceImpl.java

📌 공유 사항

  1. S3→Railway Bucket 마이그레이션 때 발견해서 배틀 발행 자동화 작업 때 같이 고치기로 미뤄뒀던 기존 버그 2건 중 하나. 발행(PUBLISHED) 시 로컬 draft를 S3로 올리는 로직이 DB 저장 트랜잭션 중간에 동기적으로 업로드+로컬삭제까지 해버려서, 이후 같은 트랜잭션에서 저장이 실패해 롤백되면 이미 올라간 S3 파일은 orphan, 이미 지워진 draft는 복구 불가능한 문제였음.
  2. 목적지 key 계산(resolveS3Key)은 트랜잭션 중 동기적으로 수행해 엔티티에 최종 경로를 저장하고, 실제 업로드/삭제(promoteToS3)만 커밋 후로 미뤄서 롤백 시엔 아예 호출되지 않게 함(draft는 그대로 남아 재시도 가능).
  3. 기존 통합테스트(AdminContentCreationIntegrationTest)는 클래스 레벨 @Transactional로 실제 커밋 없이 롤백되는 구조라 afterCommit 발동 자체를 증명하기 어려워, 해당 부분은 신규 단위테스트로 옮기고 통합테스트는 동기적으로 결정되는 최종 저장 경로만 검증하도록 범위를 조정함.

✅ 체크리스트

  • Reviewer에 팀원들을 선택했나요?
  • Assignees에 본인을 선택했나요?
  • 컨벤션에 맞는 Type을 선택했나요?
  • Development에 이슈를 연동했나요?
  • Merge 하려는 브랜치가 올바르게 설정되어 있나요?
  • 컨벤션을 지키고 있나요?
  • 로컬에서 실행했을 때 에러가 발생하지 않나요?
  • 팀원들에게 PR 링크 공유를 했나요?

📸 스크린샷

💬 리뷰 요구사항

@si-zero si-zero self-assigned this Sep 12, 2026
@si-zero si-zero added the 🐛 Fix (버그 수정) 버그를 수정할 때 사용합니다. label Sep 12, 2026
@si-zero
si-zero merged commit a7b0c3b into dev Sep 12, 2026
1 check passed
@si-zero
si-zero deleted the fix/#483 branch September 12, 2026 10:07
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🐛 Fix (버그 수정) 버그를 수정할 때 사용합니다.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

🐛 로컬 draft→S3 promote가 DB 트랜잭션과 분리되어 orphan 파일/유실 위험

1 participant