feat: 대용량 발송/상태조회/취소 API 구현 (#130) #131

Merged
seonkyu.kim merged 2 commits from feature/#130-bulk-send-api into develop 2026-02-10 14:00:26 +00:00
Owner

📋 작업 요약

대용량 발송(CSV), 발송 상태 조회, 발송 취소 API 3종을 구현합니다. Redis Hash 기반 Job 상태 관리와 PushWorker의 Job 진행률 추적을 포함합니다.

Closes #130

🛠️ 작업 내용 (Changes)

새 파일 (8개)

  • IBulkJobStore.cs — Job 상태 관리 인터페이스
  • BulkJobStore.cs — Redis Hash 기반 구현 (TTL 7일)
  • BulkJobInfo.cs — Job 상태 내부 모델
  • BulkSendResponseDto.cs — 대용량 발송 응답
  • JobStatusRequestDto.cs / JobStatusResponseDto.cs — 상태 조회
  • JobCancelRequestDto.cs / JobCancelResponseDto.cs — 취소

수정 파일 (7개)

  • PushMessageDto.csJobId 필드 추가
  • IPushService.csSendBulkAsync, GetJobStatusAsync, CancelJobAsync 추가
  • PushService.cs — CSV 파싱, Job 생성, 변수 적용 후 메시지 큐잉 구현
  • PushWorker.cs — Job 취소 체크, processing 전환, 진행률 업데이트, 완료 처리
  • PushController.cssend/bulk, job/status, job/cancel 엔드포인트
  • DependencyInjection.csIBulkJobStore 등록
  • ErrorCodes.csJobNotFound(163), JobAlreadyCompleted(164) 추가

주요 구현 사항

  • CSV 파싱: 헤더의 device_id 필수, 나머지 컬럼은 {{변수명}} 매칭용 변수
  • Job 상태 흐름: queued → processing → completed/failed/cancelled
  • Redis Hash 구조: spms_dev_bulk_job:{job_id} (status, total_count, sent_count, failed_count 등)
  • PushWorker 연동: 메시지 처리 전 취소 확인, 처리 후 카운터 증분, 전체 완료 시 자동 상태 전환

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

  • CSV 파싱은 단순 comma split 사용 (값에 콤마 포함 시 추후 개선 필요)
  • Bulk job은 DB가 아닌 Redis Hash로 관리 (DB_Schema §8 기준)
  • Job TTL 7일 (만료 후 상태 조회 불가)

체크리스트 (Self Checklist)

  • 빌드 성공 (경고/오류 0개)
  • API 응답 형식 ApiResponse<T> 사용
  • Entity 외부 노출 없이 DTO 사용
  • async/await 일관 적용
  • Clean Architecture 계층 규칙 준수
  • ErrorCodes 추가 (163, 164)

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

빌드 결과: 경고 0개, 오류 0개

## 📋 작업 요약 대용량 발송(CSV), 발송 상태 조회, 발송 취소 API 3종을 구현합니다. Redis Hash 기반 Job 상태 관리와 PushWorker의 Job 진행률 추적을 포함합니다. ## 🔗 관련 이슈 (Related Issues) Closes #130 ## 🛠️ 작업 내용 (Changes) ### 새 파일 (8개) - `IBulkJobStore.cs` — Job 상태 관리 인터페이스 - `BulkJobStore.cs` — Redis Hash 기반 구현 (TTL 7일) - `BulkJobInfo.cs` — Job 상태 내부 모델 - `BulkSendResponseDto.cs` — 대용량 발송 응답 - `JobStatusRequestDto.cs` / `JobStatusResponseDto.cs` — 상태 조회 - `JobCancelRequestDto.cs` / `JobCancelResponseDto.cs` — 취소 ### 수정 파일 (7개) - `PushMessageDto.cs` — `JobId` 필드 추가 - `IPushService.cs` — `SendBulkAsync`, `GetJobStatusAsync`, `CancelJobAsync` 추가 - `PushService.cs` — CSV 파싱, Job 생성, 변수 적용 후 메시지 큐잉 구현 - `PushWorker.cs` — Job 취소 체크, processing 전환, 진행률 업데이트, 완료 처리 - `PushController.cs` — `send/bulk`, `job/status`, `job/cancel` 엔드포인트 - `DependencyInjection.cs` — `IBulkJobStore` 등록 - `ErrorCodes.cs` — `JobNotFound(163)`, `JobAlreadyCompleted(164)` 추가 ### 주요 구현 사항 - **CSV 파싱**: 헤더의 `device_id` 필수, 나머지 컬럼은 `{{변수명}}` 매칭용 변수 - **Job 상태 흐름**: queued → processing → completed/failed/cancelled - **Redis Hash 구조**: `spms_dev_bulk_job:{job_id}` (status, total_count, sent_count, failed_count 등) - **PushWorker 연동**: 메시지 처리 전 취소 확인, 처리 후 카운터 증분, 전체 완료 시 자동 상태 전환 ## 📢 리뷰어 참고 사항 (To Reviewers) - CSV 파싱은 단순 comma split 사용 (값에 콤마 포함 시 추후 개선 필요) - Bulk job은 DB가 아닌 Redis Hash로 관리 (DB_Schema §8 기준) - Job TTL 7일 (만료 후 상태 조회 불가) ## ✅ 체크리스트 (Self Checklist) - [x] 빌드 성공 (경고/오류 0개) - [x] API 응답 형식 `ApiResponse<T>` 사용 - [x] Entity 외부 노출 없이 DTO 사용 - [x] async/await 일관 적용 - [x] Clean Architecture 계층 규칙 준수 - [x] ErrorCodes 추가 (163, 164) ## 📸 스크린샷 / 테스트 로그 (Screenshots/Logs) 빌드 결과: `경고 0개, 오류 0개`
seonkyu.kim added 2 commits 2026-02-10 13:56:59 +00:00
- POST /v1/in/push/send/bulk: CSV 대량 발송 (비동기)
- POST /v1/in/push/job/status: Job 상태 조회
- POST /v1/in/push/job/cancel: Job 취소
- BulkJobStore: Redis Hash 기반 Job 상태 관리
- PushWorker: Job 진행률 추적 및 취소 체크

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
seonkyu.kim added the
Priority
Medium
Status
In Progress
Type
Feature
labels 2026-02-10 13:57:09 +00:00
seonkyu.kim added this to the Phase 3: 메시지 & Push Core milestone 2026-02-10 13:57:13 +00:00
seonkyu.kim self-assigned this 2026-02-10 13:57:19 +00:00
seonkyu.kim requested review from Owners 2026-02-10 13:57:27 +00:00
seonkyu.kim merged commit d940948df0 into develop 2026-02-10 14:00:26 +00:00
seonkyu.kim deleted branch feature/#130-bulk-send-api 2026-02-10 14:00:47 +00:00
seonkyu.kim added
Status
Done
and removed
Status
In Progress
labels 2026-02-10 14:01:04 +00:00
Sign in to join this conversation.
No description provided.