feat: PushWorker 구현 (#110) #111

Merged
seonkyu.kim merged 1 commits from feature/#110-push-worker into develop 2026-02-10 07:18:11 +00:00
Owner

📋 작업 요약

  • RabbitMQ spms.push.queue에서 메시지를 소비하여 FCM/APNs로 발송하는 BackgroundService Worker 구현
  • Redis 중복 체크 → 디바이스 조회 → 플랫폼별 분류 → 배치 발송 → 결과 처리 → DailyStat 업데이트 전체 파이프라인

Closes #110

🛠️ 작업 내용 (Changes)

  • SPMS.Infrastructure/Workers/PushWorker.cs — PushWorker BackgroundService
    • RabbitMQ AsyncEventingBasicConsumer (Prefetch 10, Manual Ack)
    • Redis 중복 체크 (IDuplicateChecker)
    • send_type별 디바이스 조회 (single/group/broadcast)
    • 플랫폼별 분류 (iOS → APNs, Android → FCM)
    • IFcmSender.SendBatchAsync / IApnsSender.SendBatchAsync 배치 발송
    • PushSendLog INSERT (성공/실패 기록)
    • 영구 오류 시 Device 비활성화 (ShouldRemoveDevice)
    • DailyStat 증분 업데이트 (SentCnt, SuccessCnt, FailCnt)
    • 재시도 정책 (x-retry-count 헤더, 최대 3회 NACK+requeue, 초과 시 폐기)
  • SPMS.Infrastructure/DependencyInjection.cs — AddHostedService() 등록

📢 리뷰어 참고 사항 (To Reviewers)

  • PushWorker는 Scoped 서비스(Repository, UnitOfWork)를 사용하기 위해 IServiceScopeFactory로 스코프를 생성
  • FCM/APNs Sender는 Singleton이므로 직접 주입, DB 접근은 Scope 내에서 처리
  • Consumer 연결이 끊어지면 5초 후 자동 재연결 시도
  • DailyStat은 당일 레코드가 없으면 새로 생성, 있으면 증분 업데이트
  • Webhook 발송은 Phase 3-2에서 구현 예정 (현재는 스킵)

체크리스트 (Self Checklist)

  • 빌드(Build)가 성공적으로 수행되었는가?
  • 모든 단위 테스트(Unit Test)를 통과하였는가?
  • 불필요한 로그나 주석을 제거하였는가?
  • 컨벤션(Clean Architecture, Naming)을 준수하였는가?
  • 기밀 정보(비밀번호, 키 등)가 하드코딩 되어있지 않은가?

📸 스크린샷 / 테스트 로그 (Screenshots/Logs)

빌드했습니다.
    경고 0개
    오류 0개
## 📋 작업 요약 - RabbitMQ `spms.push.queue`에서 메시지를 소비하여 FCM/APNs로 발송하는 BackgroundService Worker 구현 - Redis 중복 체크 → 디바이스 조회 → 플랫폼별 분류 → 배치 발송 → 결과 처리 → DailyStat 업데이트 전체 파이프라인 ## 🔗 관련 이슈 (Related Issues) Closes #110 ## 🛠️ 작업 내용 (Changes) - [x] `SPMS.Infrastructure/Workers/PushWorker.cs` — PushWorker BackgroundService - RabbitMQ AsyncEventingBasicConsumer (Prefetch 10, Manual Ack) - Redis 중복 체크 (IDuplicateChecker) - send_type별 디바이스 조회 (single/group/broadcast) - 플랫폼별 분류 (iOS → APNs, Android → FCM) - IFcmSender.SendBatchAsync / IApnsSender.SendBatchAsync 배치 발송 - PushSendLog INSERT (성공/실패 기록) - 영구 오류 시 Device 비활성화 (ShouldRemoveDevice) - DailyStat 증분 업데이트 (SentCnt, SuccessCnt, FailCnt) - 재시도 정책 (x-retry-count 헤더, 최대 3회 NACK+requeue, 초과 시 폐기) - [x] `SPMS.Infrastructure/DependencyInjection.cs` — AddHostedService<PushWorker>() 등록 ## 📢 리뷰어 참고 사항 (To Reviewers) - PushWorker는 Scoped 서비스(Repository, UnitOfWork)를 사용하기 위해 IServiceScopeFactory로 스코프를 생성 - FCM/APNs Sender는 Singleton이므로 직접 주입, DB 접근은 Scope 내에서 처리 - Consumer 연결이 끊어지면 5초 후 자동 재연결 시도 - DailyStat은 당일 레코드가 없으면 새로 생성, 있으면 증분 업데이트 - Webhook 발송은 Phase 3-2에서 구현 예정 (현재는 스킵) ## ✅ 체크리스트 (Self Checklist) - [x] 빌드(Build)가 성공적으로 수행되었는가? - [x] 모든 단위 테스트(Unit Test)를 통과하였는가? - [x] 불필요한 로그나 주석을 제거하였는가? - [x] 컨벤션(Clean Architecture, Naming)을 준수하였는가? - [x] 기밀 정보(비밀번호, 키 등)가 하드코딩 되어있지 않은가? ## 📸 스크린샷 / 테스트 로그 (Screenshots/Logs) ``` 빌드했습니다. 경고 0개 오류 0개 ```
seonkyu.kim added 1 commit 2026-02-10 07:15:19 +00:00
seonkyu.kim added the
Priority
Urgent
Status
In Progress
Type
Feature
labels 2026-02-10 07:15:36 +00:00
seonkyu.kim added this to the Phase 3: 메시지 & Push Core milestone 2026-02-10 07:15:37 +00:00
seonkyu.kim self-assigned this 2026-02-10 07:16:58 +00:00
seonkyu.kim requested review from Owners 2026-02-10 07:17:03 +00:00
seonkyu.kim merged commit a11750db93 into develop 2026-02-10 07:18:11 +00:00
seonkyu.kim deleted branch feature/#110-push-worker 2026-02-10 07:18:31 +00:00
seonkyu.kim added
Status
Done
and removed
Status
In Progress
labels 2026-02-10 07:19:17 +00:00
Sign in to join this conversation.
No description provided.