Skip to content

[fix] #307 후속: 탈퇴 S3 삭제에서 못 지운 키를 복구할 경로가 없고 실패 알림이 Sentry 로 가지 않는다 #312

Open

Description

@OnlyReadOneBook

📝 설 명

#307 은 #311 머지로 자동으로 닫혔습니다. 객체별 실패를 성공으로 세던 원래 결함은 고쳐졌지만, #307 의 해야할 일 중 실패 키를 탈퇴 뒤에 복구하는 경로와 공개 URL 확인은 구현되지 않았습니다. 이 이슈는 그 남은 범위만 다룹니다.

확인 기준: main 커밋 b7a67896d15d27de491e45d7a8c88162c1849e80, 2026-10-04. 운영에는 #311 이 포함된 edcd2fb 까지 배포됐습니다.

#311 에서 해결된 부분

  • DeleteObjectsResponse 의 deleted()·errors() 를 읽어 실제로 지워진 키만 셉니다.
  • 일시 오류 코드는 최대 2회 더 지우고, 권한 오류는 다시 지우지 않습니다.
  • 끝내 못 지운 키는 키와 오류 코드를 log.error 로 남깁니다.
  • 로컬에서 S3ServiceManagedMediaTest 15개가 통과했습니다.

남은 부분과 근거

  1. 실패 키를 다시 정리할 경로가 없습니다. 못 지운 키는 S3Service.java:445-448 의 로그 한 줄로만 남습니다. 어디에도 기록되지 않고 나중에 다시 지우는 작업도 없습니다. 탈퇴는 이미 커밋된 뒤라(AccountWithdrawalService.java:158-159) 같은 사용자로 다시 지울 계기가 사라집니다. 권한 오류처럼 원인을 고친 뒤 다시 지워야 하는 경우가 특히 그렇습니다.
  2. 실패 로그가 Sentry 로 가지 않습니다. build.gradle 에는 sentry-spring-boot-starter-jakarta 만 있고 로그를 Sentry 로 보내는 sentry-logback 연동이 없습니다. Sentry 는 GlobalExceptionHandler 의 captureException 으로만 보고되므로, afterCommit 안에서 남긴 이 log.error 는 CloudWatch 에만 남고 알림이 오지 않습니다.
  3. 응답에서 빠진 키는 재시도 없이 바로 실패로 처리됩니다. S3Service.java:404-408·434-441 의 MissingDeleteOutcome 은 일시적일 가능성이 높은데 일시 오류와 달리 다시 지우지 않습니다. 이 경로를 다루는 테스트도 없습니다.
  4. 새 테스트 중 일부는 수정 전 코드에서도 통과합니다. 전부 성공, 일부 AccessDenied, 전부 AccessDenied 테스트는 deleteObjects 호출 횟수만 검증합니다. 수정 전 구현도 호출을 1회 하고 반환값을 버렸으므로 이 셋은 그대로 녹색입니다. 성공 수 집계와 실패 키 기록은 어떤 테스트로도 고정되지 않았습니다.
  5. 공개 URL 확인이 남아 있습니다. [fix] 회원 탈퇴 시 S3 일괄 삭제의 개별 실패가 무시되어 미디어가 잔존 #307 의 마지막 항목과 fix: 탈퇴 S3 일괄 삭제에서 객체별 실패를 성공으로 세지 않는다 #311 테스트 계획의 배포 후 403 확인이 모두 미체크입니다.

🚀 해야할 일

  • 탈퇴 뒤 못 지운 키를 찾고 다시 지울 수 있게 한다. 일시 오류와 원인 해소가 필요한 오류를 구분하고, 재시도 뒤에도 남은 키가 사라지지 않게 한다.
  • 미처리 실패가 생기면 운영자가 알 수 있게 한다(예: Sentry 이벤트).
  • MissingDeleteOutcome 을 재시도 대상으로 볼지 정하고 테스트로 고정한다.
  • 성공 수 집계와 실패 키 기록을 검증해, 수정 전 구현에서는 실패하는 회귀 테스트로 보강한다.
  • 실패 키를 복구한 뒤 해당 객체의 공개 URL 이 403 이 되는지 확인한다.

관련: #307, #311, #157. 특정 큐·스케줄러·테이블 도입을 전제로 하지 않습니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions