Skip to content

#411 [Feat] 어드민 공지 발송 결과 조회 API 추가 - #412

Merged
si-zero merged 6 commits into
devfrom
feat/#411
Aug 26, 2026
Merged

#411 [Feat] 어드민 공지 발송 결과 조회 API 추가#412
si-zero merged 6 commits into
devfrom
feat/#411

Conversation

@si-zero

@si-zero si-zero commented Aug 26, 2026

Copy link
Copy Markdown
Member

#️⃣ 연관된 이슈

📝 작업 내용

✨ Feat

내용 파일
발송 결과 집계 엔티티/저장소 추가 NotificationDeliveryResult.java, NotificationDeliveryResultRepository.java
에러 코드 추가 ErrorCode.java
FCM/APNs 발송 성공 여부를 CompletableFuture<Boolean>로 반환하도록 변경 FcmPushService.java, ApnsPushService.java
공지/예약 알림 발송 시 발송 결과 집계 로직 추가 NotificationDispatchService.java, NotificationScheduleDispatcher.java
발송 결과 응답 DTO 추가 AdminNoticeDeliveryResultResponse.java
발송 결과 조회 서비스 로직 추가 AdminNotificationService.java
발송 결과 조회 API 엔드포인트 추가 AdminNotificationController.java

📚 Docs

내용 파일
공지 발송 결과 조회 API 명세 추가 docs/api-specs/notification-api.md

📌 공유 사항

  1. GET /api/v1/admin/notices/{noticeId}/delivery-result로 대상 디바이스 수, 성공/실패 건수를 조회할 수 있습니다.
  2. Android(FCM)는 동기, iOS(APNs)는 비동기 발송이라, 전체 발송이 끝나기 전에는 pending: true로 내려갑니다. CompletableFuture.allOf로 모든 디바이스 발송이 끝난 시점에 최종 성공/실패 건수를 한 번에 갱신합니다.
  3. 관리자 발송 트리거(notifyAdminNotice)를 거치는 NOTICE/EVENT 카테고리 공지와 예약 알림(NotificationScheduleDispatcher)만 결과가 집계됩니다. CONTENT 카테고리로 등록한 공지는 애초에 관리자 발송 트리거를 안 타므로 결과가 없고, 조회 시 404가 납니다.
  4. 실패 사유별 세부 분류(만료 토큰 vs 그 외)는 이번 스코프에 포함하지 않았습니다. 필요하면 후속 이슈로 분리하는 게 좋을 것 같습니다.

✅ 체크리스트

  • Reviewer에 팀원들을 선택했나요?
  • Assignees에 본인을 선택했나요?
  • 컨벤션에 맞는 Type을 선택했나요?
  • Development에 이슈를 연동했나요?
  • Merge 하려는 브랜치가 올바르게 설정되어 있나요?
  • 컨벤션을 지키고 있나요?
  • 로컬에서 실행했을 때 에러가 발생하지 않나요?
  • 팀원들에게 PR 링크 공유를 했나요?

📸 스크린샷

./gradlew test 전체 통과. NotificationDispatchServiceTest 신규 추가, AdminNotificationServiceTest/NotificationScheduleDispatcherTest에 발송 결과 관련 케이스 추가.

💬 리뷰 요구사항

  1. FCM은 동기 호출이라 firebaseMessaging.send() 자체가 블로킹인데, 대량 발송 시 이 방식이 응답 지연으로 이어질 수 있어 비동기 처리(예: sendAsync)로 바꿔야 할지 의견 부탁드립니다. (이번 PR 스코프는 아니고, 발송 결과 집계 구조에 영향이 있어 미리 여쭤봅니다.)

@si-zero si-zero self-assigned this Aug 26, 2026
@si-zero si-zero added the ✨ Feat (기능 추가) 새로운 기능을 추가할 때 사용합니다. label Aug 26, 2026
@si-zero si-zero linked an issue Aug 26, 2026 that may be closed by this pull request
4 tasks
@si-zero
si-zero merged commit 087fea5 into dev Aug 26, 2026
1 check passed
@si-zero
si-zero deleted the feat/#411 branch August 26, 2026 07:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

✨ Feat (기능 추가) 새로운 기능을 추가할 때 사용합니다.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

✨ Feat: 어드민 공지 발송 결과(성공/실패 건수) 조회 API 추가

1 participant