Skip to content

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

Open
hwistlezz wants to merge 107 commits into
developfrom
feat/#205/media-expired-cleanup
Open

hwistlezz wants to merge 107 commits into
developfrom
feat/#205/media-expired-cleanup

Conversation

@hwistlezz

@hwistlezz hwistlezz commented Sep 4, 2026

Copy link
Copy Markdown
Member

🔥 작업 내용 (What)

업로드를 끝내지 않았거나 콘텐츠에 연결하지 않은 이미지, 변환에 실패한 파일을 보존 기간이 지난 뒤 정리하도록 추가했습니다.

삭제 직전에 DB 상태를 다시 확인하고, S3 정리가 끝난 뒤에만 DB 처리를 마칩니다. 중간에 실패하거나 서버가 재시작되면 남은 작업을 이어서 처리합니다. 기본 설정에서는 실행하지 않습니다.


🧩 변경 사항 (Details)

  • 업로드 만료 후 유예 시간과 24시간·7일 보존 기간을 확인하도록 정리 정책을 추가했습니다.
  • 짧은 transaction에서 PURGING 상태와 purgeToken을 저장한 뒤, transaction 밖에서 S3 object version을 삭제합니다. 일부만 삭제됐다면 DB를 먼저 제거하지 않습니다.
  • 정상 BOUND·RETIRED 이미지와 변환 중인 이미지는 보호합니다. FAILED BOUND와 backfill FAILED는 파일을 정리한 뒤에도 실패 상태와 필요한 기록을 남깁니다.
  • V25에서 재시도 시각과 조회 인덱스를 추가했습니다. keyset 방식으로 대상을 순환 조회하며, 기본 처리량은 프로세스당 한 실행에서 최대 50개입니다.
  • Spring에 별도 실행 thread, 시간·조회량 제한과 실패 지표를 추가했습니다. 로그와 metric tag에 asset ID, key, token이나 예외 원문을 넣지 않습니다.
  • 정리용 IAM은 별도 옵션으로 켜도록 하고, 지정한 원본·파생본 media 경로에만 허용했습니다. worker와 legacy 이미지의 삭제 권한은 늘리지 않았습니다.
  • docs/media/asset-cleanup-runbook.md에 설정, DRY_RUN 확인, 삭제 승인, 중단과 재시도 절차를 정리했습니다.

테스트

  • 425b948에서 ./gradlew.bat clean build --no-daemon 통과: 테스트 991개, 실패·오류·건너뛴 테스트 0개.
  • 실제 MySQL 정리 transaction·동시성 테스트 17개, migration·인덱스 테스트 3개와 모듈 경계 검사를 포함합니다.
  • 서버 CI의 전체 빌드와 MySQL 테스트 확인도 통과했습니다.
  • 인프라 CI에서 권한·배포 계약 검사, Linux worker ZIP 생성과 SAM lint·build가 통과했습니다.
  • git diff --check 통과. 테스트 종료 과정에서 MySQL 연결·EPR 종료 경고가 있었지만 최종 빌드 종료 코드는 0이고 테스트 XML에도 실패는 없습니다.

📸 스크린샷

화면 변경은 없습니다. 테스트 결과와 CI 링크는 위에 정리했습니다.


⚠️ 주의 사항 (Caution)

  • 선행 PR #204를 기준으로 작업했습니다. 먼저 병합한 뒤 이 PR의 대상을 develop으로 변경해야 합니다.
  • CleanupAccessEnabled=false, AWS_MEDIA_CLEANUP_ENABLED=false, AWS_MEDIA_CLEANUP_MODE=DRY_RUN이 기본값입니다. 활성화하려면 업로드 만료 후 유예 시간을 명시해야 합니다.
  • 특정 S3 version의 삭제는 영구 삭제입니다. 실제 AWS 적용·파일 삭제·운영 배포·backfill은 실행하지 않았습니다.
  • DB에 없는 파일이나 실패한 재변환 spec의 일부 파일을 찾는 정합성 복구는 다음 작업입니다. 이 작업과 dev E2E까지 완료하기 전에는 이미지 작업 발급을 활성화하지 않습니다.
  • 개인정보 삭제 정책, 정상 연결·RETIRED 이미지의 자동 삭제, 기존 URL 제거와 클라이언트 변경은 포함하지 않았습니다.

🔗 관련 이슈

Closes #205


✅ 체크리스트

  • 로컬 전체 빌드 및 테스트
  • 실제 MySQL transaction·동시성·migration 테스트
  • GitHub CI와 worker ZIP·SAM 검증
  • 코드 리뷰에서 확인한 수정 사항 반영

@coderabbitai

coderabbitai Bot commented Sep 4, 2026

Copy link
Copy Markdown

Important

  • 🔍 Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Advanced

Run ID: 72597714-055e-4b7a-801b-80be721eba29


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@hwistlezz hwistlezz self-assigned this Sep 4, 2026
@hwistlezz
hwistlezz marked this pull request as ready for review September 4, 2026 14:29
@hwistlezz
hwistlezz requested a review from gichanGim September 5, 2026 06:04
@gichanGim
gichanGim force-pushed the feat/#205/media-expired-cleanup branch from 425b948 to f7e619d Compare September 9, 2026 00:25
@hwistlezz
hwistlezz changed the base branch from feat/#203/backfill-failure-reporting to develop September 16, 2026 15:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

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

1 participant