Skip to content

[Feat] 만료 및 실패 이미지 정리 추가 #205

Description

@hwistlezz

📌 이슈 종류

  • ✨ 기능 추가 (Feature)

📝 작업 내용

업로드를 끝내지 않았거나 콘텐츠에 연결하지 않은 이미지, 변환에 실패한 파일이 계속 쌓이지 않도록 정리 기능을 추가합니다. 기존의 정리 대상 조회에 실제 정리와 중단 후 재개 처리를 연결하는 작업입니다.

정리 직전에 DB 상태를 다시 확인하고 정리 중으로 표시한 뒤, DB 트랜잭션 밖에서 S3 파일을 삭제합니다. 중간에 작업이 멈춰도 같은 작업을 이어서 처리할 수 있게 합니다. 정상적으로 연결된 이미지, 교체 후 보관 중인 이미지와 변환 중인 이미지는 삭제하지 않습니다.

✅ 체크리스트

  • 선행 PR #204를 기준으로 전용 작업 브랜치 준비
  • 계약에 정한 PENDING_UPLOAD·EXPIRED·READY UNBOUND·FAILED 보존 기간과 업로드 URL 만료 조건 적용
  • 정리 직전 잠금 안에서 연결·변환 상태와 보존 기간을 다시 확인
  • ACTIVE → PURGING 전이와 purgeToken을 기록하고, 중단된 정리는 같은 token으로 재개
  • S3 삭제는 DB 트랜잭션 밖에서 수행하고, 정확한 asset 경로와 object version만 처리
  • S3 일부 삭제 실패 시 DB를 먼저 제거하지 않고 다음 실행에서 재시도
  • 일반 미연결 이미지의 정리와 FAILED BOUND·backfill FAILED 기록 보존을 구분
  • BOUND FAILED의 원본·파생본을 정리한 뒤에도 실패 상태와 콘텐츠 슬롯 유지
  • 연결·업로드 완료·결과 반영과 정리가 겹치는 경우를 실제 MySQL 테스트로 검증
  • 정리 대상 조회와 중단 작업 재개에 keyset pagination을 적용하고 MySQL 실행 계획 확인
  • 기본 비활성 설정, 제한된 삭제 권한, 처리량 상한과 실패 지표 적용
  • 보존 기간·실행·중단·재시도·운영 승인 절차 문서화
  • 관련 테스트·전체 빌드·CI와 코드 리뷰 후 검토 요청

검증 결과

  • PR #206의 425b948에서 전체 빌드와 테스트 991개가 통과했습니다. 실패·오류·건너뛴 테스트는 없습니다.
  • 실제 MySQL 정리·동시성·migration 테스트와 GitHub 서버·인프라 CI도 통과했습니다.
  • 기본 비활성 상태를 유지하며 실제 AWS 적용이나 파일 삭제는 하지 않았습니다.

💬 참고 사항

  • 선행 PR: [Fix] 이미지 backfill 실패 원인 보고 보완 (#203) #204. 기준 문서: docs/media/image-delivery-contract-v1.md의 이미지 수명과 정리 정책, docs/adr/0001-media-module-and-image-pipeline.md.
  • 안전한 초기 보존 기간은 업로드 미완료·만료 24시간, 일반 업로드 READY UNBOUND 24시간, backfill UNBOUND와 FAILED 7일입니다. 실제 활성화 전 운영 환경의 값과 업로드 만료 후 유예 시간을 확인합니다.
  • media의 상태 전이, 저장소 연동, 실행부와 관련 테스트를 수정합니다. 필요한 조회 인덱스는 새 migration으로 추가하고 기존 migration은 수정하지 않습니다.
  • 삭제 권한은 새 private original bucket의 media/originals/와 기존 delivery bucket의 media/renditions/로 제한하고 기본 비활성으로 둡니다. legacy 파일 경로의 삭제 권한은 추가하지 않습니다.
  • 정상 BOUND·RETIRED 파일의 자동 삭제, 개인정보 삭제 정책 변경과 기존 URL 제거는 포함하지 않습니다.
  • DB에 없는 파일과 실패한 재변환의 일부 파생본을 찾는 정합성 복구는 다음 작업으로 분리합니다. 두 작업과 개발 환경 통합 검증이 끝나기 전에는 이미지 작업 발급을 활성화하지 않습니다.
  • 실제 AWS 적용·파일 삭제·운영 배포·backfill 실행·PR 병합은 하지 않습니다.

Activity

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

Metadata

Metadata

Assignees

Labels

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions