feat: FCM 발송 모듈 구현 (#104) #105

Merged
seonkyu.kim merged 1 commits from feature/#104-fcm-sender into develop 2026-02-10 06:48:28 +00:00
Owner

📋 작업 요약

  • Firebase Admin SDK 기반 FCM 발송 모듈 구현
  • 단건/배치(500건 단위) 발송 지원
  • Service별 FirebaseApp 인스턴스 캐싱 (멀티테넌시)
  • FCM 에러 코드별 처리 로직 (토큰 삭제/재시도 판단)

Closes #104

🛠️ 작업 내용 (Changes)

  • SPMS.Application/DTOs/Push/PushResultDto.cs — 발송 결과 DTO (ShouldRemoveDevice, ShouldRetry 플래그)
  • SPMS.Application/Interfaces/IFcmSender.cs — FCM 발송 인터페이스 (SendAsync, SendBatchAsync)
  • SPMS.Infrastructure/Push/FcmSender.cs — Firebase Admin SDK 연동 구현
  • SPMS.Infrastructure/DependencyInjection.cs — IFcmSender DI 등록 (Singleton)
  • SPMS.Infrastructure/SPMS.Infrastructure.csproj — FirebaseAdmin 3.4.0 패키지 추가

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

  • FcmCredentialsJson(Service Account JSON)을 받아 FirebaseApp을 SHA256 해시 키로 캐싱
  • SendBatchAsync는 내부적으로 500건씩 chunk하여 SendEachForMulticastAsync 호출
  • PushResultDtoShouldRemoveDevice/ShouldRetry 플래그로 PushWorker가 후처리 판단 가능
  • FCM 에러 매핑: Unregistered → 디바이스 삭제, InvalidArgument/SenderIdMismatch → 디바이스 삭제, Unavailable/Internal/QuotaExceeded → 재시도
  • Android Priority.High 설정으로 즉시 전달 보장

체크리스트 (Self Checklist)

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

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

빌드했습니다.
    경고 0개
    오류 0개
## 📋 작업 요약 - Firebase Admin SDK 기반 FCM 발송 모듈 구현 - 단건/배치(500건 단위) 발송 지원 - Service별 FirebaseApp 인스턴스 캐싱 (멀티테넌시) - FCM 에러 코드별 처리 로직 (토큰 삭제/재시도 판단) ## 🔗 관련 이슈 (Related Issues) Closes #104 ## 🛠️ 작업 내용 (Changes) - [x] `SPMS.Application/DTOs/Push/PushResultDto.cs` — 발송 결과 DTO (ShouldRemoveDevice, ShouldRetry 플래그) - [x] `SPMS.Application/Interfaces/IFcmSender.cs` — FCM 발송 인터페이스 (SendAsync, SendBatchAsync) - [x] `SPMS.Infrastructure/Push/FcmSender.cs` — Firebase Admin SDK 연동 구현 - [x] `SPMS.Infrastructure/DependencyInjection.cs` — IFcmSender DI 등록 (Singleton) - [x] `SPMS.Infrastructure/SPMS.Infrastructure.csproj` — FirebaseAdmin 3.4.0 패키지 추가 ## 📢 리뷰어 참고 사항 (To Reviewers) - `FcmCredentialsJson`(Service Account JSON)을 받아 FirebaseApp을 SHA256 해시 키로 캐싱 - `SendBatchAsync`는 내부적으로 500건씩 chunk하여 `SendEachForMulticastAsync` 호출 - `PushResultDto`에 `ShouldRemoveDevice`/`ShouldRetry` 플래그로 PushWorker가 후처리 판단 가능 - FCM 에러 매핑: Unregistered → 디바이스 삭제, InvalidArgument/SenderIdMismatch → 디바이스 삭제, Unavailable/Internal/QuotaExceeded → 재시도 - Android Priority.High 설정으로 즉시 전달 보장 ## ✅ 체크리스트 (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 06:45:02 +00:00
seonkyu.kim added the
Priority
Urgent
Status
In Progress
Type
Feature
labels 2026-02-10 06:45:16 +00:00
seonkyu.kim self-assigned this 2026-02-10 06:45:20 +00:00
seonkyu.kim added this to the Phase 3: 메시지 & Push Core milestone 2026-02-10 06:45:26 +00:00
seonkyu.kim requested review from Owners 2026-02-10 06:45:35 +00:00
seonkyu.kim merged commit e2cf76fd11 into develop 2026-02-10 06:48:28 +00:00
seonkyu.kim deleted branch feature/#104-fcm-sender 2026-02-10 06:48:47 +00:00
seonkyu.kim added
Status
Done
and removed
Status
In Progress
labels 2026-02-10 06:49:58 +00:00
Sign in to join this conversation.
No description provided.