pmdart #233(2026-08-03 잠재 결함 리뷰)의 서버측 몫.
배경
앱은 첨부 시점에 업로드하고 제출 시점에 DB 를 쓴다. pmdart#249 로 앱측 보상(채팅 INSERT 실패 시 삭제, 프로필·펫 사진 교체 시 구 파일 삭제)은 들어갔지만, 작성형 화면(게시글·후기·돌봄기록·아지트·업체 대표사진)에서 업로드 후 이탈하면 공개 URL 파일이 고아로 남는다. 제출 실패 시 지우면 재시도가 죽은 URL 을 참조하므로 앱에서는 못 지우고, 앱 종료·프로세스 킬은 어차피 클라이언트가 커버 불가 — 서버측 주기 청소가 유일한 안전망.
제안
- 주기(예: 주 1회) 작업: media 버킷 객체 목록 vs 참조 URL 대조 후 미참조 + 생성 N일(예: 7일) 경과 파일 삭제
- 유예 기간 필수 — 작성 중(아직 제출 전)인 첨부를 지우면 안 된다
- 참조 소스 전수(누락 시 정상 파일 삭제 사고): posts.image_url·image_thumbnail_url, chat_messages.image_url·image_thumbnail_url, facility_reviews 사진 배열·p_videos jsonb(url·thumb·path), users.profile_image_url, pets.image_url, business_profiles 대표사진, 그 외 media 공개 URL 저장 컬럼 grep 로 확정
- 실행 위치: pg_cron + storage API 또는 Edge Function 스케줄
- 삭제 전 드라이런(목록만 산출) 1회 돌려 참조 소스 누락 검증
참고
- 앱측 삭제 헬퍼: pmdart lib/services/storage_service.dart 의 discardByUrl/mediaPathFromUrl (경로 규약 //.)
pmdart #233(2026-08-03 잠재 결함 리뷰)의 서버측 몫.
배경
앱은 첨부 시점에 업로드하고 제출 시점에 DB 를 쓴다. pmdart#249 로 앱측 보상(채팅 INSERT 실패 시 삭제, 프로필·펫 사진 교체 시 구 파일 삭제)은 들어갔지만, 작성형 화면(게시글·후기·돌봄기록·아지트·업체 대표사진)에서 업로드 후 이탈하면 공개 URL 파일이 고아로 남는다. 제출 실패 시 지우면 재시도가 죽은 URL 을 참조하므로 앱에서는 못 지우고, 앱 종료·프로세스 킬은 어차피 클라이언트가 커버 불가 — 서버측 주기 청소가 유일한 안전망.
제안
참고