feat: 멤버 즉시 삭제 기능 구현 (#109) #112
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
📌 작업 내용 및 특이사항
논리 삭제 -> 물리 삭제흐름으로 진행되는데, 테스트 편리성을 위해 API 요청 즉시 물리 삭제 처리되도록 기능을 구현했습니다.✅ S3 스토리지 retry, time-out 설정 추가
Retry(재시도)를 설정했습니다.time-out(타임아웃)을 설정했습니다.application-storage.yml파일에 S3retry,time-out설정을 추가했습니다.S3Config에서S3Client빈을 등록하는 부분에retry,time-out옵션을 설정했습니다.Retry(재시도)는 코드 상으로 직접 구현하거나Spring Retry같은 라이브러리를 활용할 수도 있지만, 코드가 더 복잡해지고 학습하는 데 시간이 걸릴 것 같아AWS SDK V2가 기본으로 제공하는 재시도와 타임아웃 설정 옵션을 사용했습니다.✅ 멤버 즉시 삭제 기능 구현 (CASCADE)
Member,StudyLog,TripReport는 이미지를 보유하고 있는데, 관련된 실제 이미지를 함께 삭제하기 위해트랜잭션 기반 이벤트 처리(Transactional Event)방식을 사용했습니다.✅ 이벤트 기반 이미지 배치 정리 기능 추가
일부 이미지가 삭제된 시점에서 에러가 발생하면, 데이터베이스 변경사항은 모두 롤백되지만 S3와 같은 외부 스토리지는 이미 처리된 작업에 대한 롤백이 불가능하기 때문에 DB 데이터와 실제 스토리지 상태 간의 정합성이 불일치하는 문제가 발생할 수 있습니다.
이를 방지하고 안정성을 높이고자
@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)를 사용했습니다.이벤트 발행/이벤트 정의/구독을 모두image.application계층에 배치했습니다.이미지 정리 로직이 멤버 도메인, 멤버 삭제와 같은 행위에 종속되지 않고 이미지 정리를 중심으로 동작하기 위해서
image모듈에 정의했습니다. 추후 다른 곳에서 이미지 정리 이벤트가 필요할 경우 재사용하거나 커스텀해서 사용할 수 있을 것 같습니다.🌱 관련 이슈
🔍 참고사항(선택)
ImageService.cleanupBatch()에서 이미지 정리에 실패한 항목을 따로 저장하거나 바로 재시도하지 않고 단순히 로그만 남기도록 구현했습니다.이 기능이 핵심 기능이 아니라 효율적이고 빠른 테스트를 위한 보조 기능이라 이렇게 설계했는데, 추후 확장할 수도 있을 것 같습니다.
찾아 보니
failed_deleted_image같은 테이블을 별도로 두고 스케줄러를 기반으로 재시도하는 방법을 적용할 수도 있고,Outbox 패턴을 적용해 실패한 삭제 작업을 비동기로 처리하는 방식을 적용할 수도 있고,
메트릭 수집 및 모니터링 시스템을 도입해 이미지 정리 성공률과 실패율을 추적하는 방향으로도 발전시킬 수 있다고 합니다.
참고하면 좋을 것 같습니다!
📚 기타(선택)