attachment는 READY 전까지 download할 수 없다

object storage와 데이터베이스가 하나의 transaction이 아니므로 중간 상태를 공개하지 않고 실패 상태와 cleanup을 수명주기에 포함한다.

UPLOADING

임시 객체

추측할 수 없는 temporary key로 bytes를 저장한다.

SCANNING

검사 중

checksum·media type·악성 검사를 수행한다.

READY

공개 가능

immutable key와 검증된 metadata로 download를 허용한다.

READY만 download endpoint가 해석할 수 있는 공개 상태다
검사 또는 DB 반영이 실패했는가?
REJECTED

접근 차단

실패 이유를 기록하고 공개 key를 만들지 않는다.

CLEANUP

임시 객체 삭제

재시도 가능한 정리 작업으로 orphan을 제거한다.

핵심: DB row와 object가 잠시 어긋날 수 있음을 상태 기계로 드러내야 안전한 재시도와 정리가 가능하다.