### 🎟️ 상위 작업 (Ticket Number) HSC-303 ### Type (필수) ⚡ perf ### Area (필수) 🗂️ area: BE ### Priority (필수) 🔥 priority: P0 ### Team (필수) Customer Team ### 📅 시작 날짜 2026-04-01 ### 🏁 종료 날짜 2026-04-01 ### 📝 상세 내용(Description) - `AbortPolicy` 적용 이후 `user-log` request path는 보호되었지만, `adminLogFeatureTaskExecutor` 포화 시 `rejected`가 명시적으로 드러나기 시작했다. - 현재는 이 reject가 metric과 로그로만 보이고 실제 복구 가능한 실패건으로 저장되지 않기 때문에, 최종 churn 반영 유실로 그대로 남는다. - 이번 이슈의 목적은 reject 및 admin dispatch 실패건을 저장 가능한 구조로 전환하고, scheduler 기반 retry를 통해 실제 `member_action_feature` 반영률이 얼마나 회복되는지 다시 검증하는 것이다. 핵심 범위는 아래와 같다. - `user_log_admin_dispatch_outbox` 테이블 및 상태값 도입 - `rejected` / `non_2xx` / `error` 실패건 저장 - `READY -> PROCESSING -> ACKED/RETRY/DEAD` 상태 전이 구현 - `FOR UPDATE SKIP LOCKED` 기반 claim 및 scheduler retry 구현 ### ✅ 체크리스트(Tasks) - [ ] `user_log_dispatch_status` enum 및 `user_log_admin_dispatch_outbox` 스키마 추가 - [ ] admin dispatch 실패건 저장 로직 추가 (`rejected`, `non_2xx`, `error`) - [ ] outbox status 전이 및 `attempt_count`, `next_retry_at`, `last_error` 처리 - [ ] `FOR UPDATE SKIP LOCKED` 기반 retry 대상 claim 쿼리 구현 - [ ] `UserLogAdminDispatchScheduler` 및 `dispatchReadyBatch()` 구현 - [ ] retry 성공/실패 결과에 따른 `ACKED`, `RETRY`, `DEAD` 반영
🎟️ 상위 작업 (Ticket Number)
HSC-303
Type (필수)
⚡ perf
Area (필수)
🗂️ area: BE
Priority (필수)
🔥 priority: P0
Team (필수)
Customer Team
📅 시작 날짜
2026-04-01
🏁 종료 날짜
2026-04-01
📝 상세 내용(Description)
AbortPolicy적용 이후user-logrequest path는 보호되었지만,adminLogFeatureTaskExecutor포화 시rejected가 명시적으로 드러나기 시작했다.member_action_feature반영률이 얼마나 회복되는지 다시 검증하는 것이다.핵심 범위는 아래와 같다.
user_log_admin_dispatch_outbox테이블 및 상태값 도입rejected/non_2xx/error실패건 저장READY -> PROCESSING -> ACKED/RETRY/DEAD상태 전이 구현FOR UPDATE SKIP LOCKED기반 claim 및 scheduler retry 구현✅ 체크리스트(Tasks)
user_log_dispatch_statusenum 및user_log_admin_dispatch_outbox스키마 추가rejected,non_2xx,error)attempt_count,next_retry_at,last_error처리FOR UPDATE SKIP LOCKED기반 retry 대상 claim 쿼리 구현UserLogAdminDispatchScheduler및dispatchReadyBatch()구현ACKED,RETRY,DEAD반영