You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
업로드를 끝내지 않았거나 콘텐츠에 연결하지 않은 이미지, 변환에 실패한 파일이 계속 쌓이지 않도록 정리 기능을 추가합니다. 기존의 정리 대상 조회에 실제 정리와 중단 후 재개 처리를 연결하는 작업입니다.
정리 직전에 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도 통과했습니다.
📌 이슈 종류
📝 작업 내용
업로드를 끝내지 않았거나 콘텐츠에 연결하지 않은 이미지, 변환에 실패한 파일이 계속 쌓이지 않도록 정리 기능을 추가합니다. 기존의 정리 대상 조회에 실제 정리와 중단 후 재개 처리를 연결하는 작업입니다.
정리 직전에 DB 상태를 다시 확인하고 정리 중으로 표시한 뒤, DB 트랜잭션 밖에서 S3 파일을 삭제합니다. 중간에 작업이 멈춰도 같은 작업을 이어서 처리할 수 있게 합니다. 정상적으로 연결된 이미지, 교체 후 보관 중인 이미지와 변환 중인 이미지는 삭제하지 않습니다.
✅ 체크리스트
검증 결과
425b948에서 전체 빌드와 테스트 991개가 통과했습니다. 실패·오류·건너뛴 테스트는 없습니다.💬 참고 사항
docs/media/image-delivery-contract-v1.md의 이미지 수명과 정리 정책,docs/adr/0001-media-module-and-image-pipeline.md.media의 상태 전이, 저장소 연동, 실행부와 관련 테스트를 수정합니다. 필요한 조회 인덱스는 새 migration으로 추가하고 기존 migration은 수정하지 않습니다.media/originals/와 기존 delivery bucket의media/renditions/로 제한하고 기본 비활성으로 둡니다. legacy 파일 경로의 삭제 권한은 추가하지 않습니다.