[BE-42] 수집 seen set 종료 정리 · 잔존 데이터 관측
작업 내용 (설계 의도)
변경 사항
TDD 20260730-확장-안전-공고수집-배치-tdd.md에 따라 cycle의 seen sourceJobId 보존을 bounded하게 만든다. named safe-close predicate(SUCCESS && isComplete && fetchedCount>0)의 final missed delta, complete-zero SUCCESS, FAILED, BUDGET_EXHAUSTED terminal 전이와 같은 짧은 transaction에서 해당 cycle seen rows를 삭제한다. complete-zero SUCCESS는 final delta 없이 삭제만 한다. 방어적으로 10:15 KST cleanup scheduler가 48시간보다 오래된 terminal cycle 잔존 행만 1,000건 chunk로 삭제한다. RUNNING cycle 행은 절대 정리하지 않으며 summary의 seenRowsOlderThan48Hours가 0이 아니면 운영 경고를 남긴다. 롤백은 cleanup scheduler 중지만 하면 되고 terminal semantics는 변하지 않는다.
의존
- BE-33
- DBA seen table migration
다이어그램
처리 흐름
sequenceDiagram participant C as CycleService participant S as SeenRepository participant J as CleanupScheduler C->>S: safe final delta or guarded delete J->>S: find terminal residual older 48h J->>S: delete 1000-row chunk S-->>J: residual metric
클래스 의존
flowchart LR CycleDomainService --> SeenPostingRepository SeenCleanupUseCase --> SeenPostingRepository SeenCleanupScheduler --> SeenCleanupUseCase OperationsSummary --> SeenPostingRepository
테스트 케이스
- safe-close predicate SUCCESS의 final delta와 seen row 삭제는 같은 transaction에서 함께 커밋되며 실패 시 함께 롤백된다.
- complete-zero SUCCESS는 final delta 없이 seen row만 삭제하고 closeGuarded를 유지한다.
- FAILED와 BUDGET_EXHAUSTED terminal 전이는 seen rows를 삭제하고 마감 델타를 실행하지 않는다.
- cleanup은 48시간 미만 또는 RUNNING cycle seen rows를 삭제하지 않는다.
- 48시간 초과 terminal residual은 1,000건 단위로만 삭제되고 summary metric에 count가 노출된다.