[feature] 개발서버에서 동아리 모집 상태 변경시 라이브서버 푸시알림 전송안되게 변경한다#1079
[feature] 개발서버에서 동아리 모집 상태 변경시 라이브서버 푸시알림 전송안되게 변경한다#1079lepitaaar merged 4 commits intodevelop/befrom
Conversation
- FcmTopicResolver 생성하여 spring.profiles.active 기반 토픽 prefix 생성 - RecruitmentStateCalculator를 @component로 리팩터링하여 FcmTopicResolver 주입 - FcmAsyncService 구독/구독해제 시 prefixed 토픽 사용하도록 수정 - application.properties에 기본 profile을 local로 설정 토픽 네이밍: - prod: clubId (기존 호환성 유지) - staging: staging_clubId - local: local_clubId
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
Warning
|
| 코호트 / 파일(s) | 요약 |
|---|---|
RecruitmentStateCalculator DI 변환 backend/src/main/java/moadong/club/util/RecruitmentStateCalculator.java |
@Component, @RequiredArgsConstructor 추가, static → 인스턴스 메서드(calculate, buildRecruitmentMessage)로 전환, 기존/신규 상태 동일 시 조기 반환 추가, FcmTopicResolver 주입 사용. |
호출자 변경 (의존성 주입) backend/src/main/java/moadong/club/service/ClubProfileService.java, backend/src/main/java/moadong/club/service/RecruitmentStateChecker.java |
RecruitmentStateCalculator 필드 추가 및 기존 static 호출을 인스턴스 호출로 변경(생성자 인수 변경). |
FCM 토픽 해석 및 구독/구독해제 backend/src/main/java/moadong/fcm/util/FcmTopicResolver.java, backend/src/main/java/moadong/fcm/service/FcmAsyncService.java |
새로운 FcmTopicResolver 컴포넌트 추가(프로파일 기반 접두사), subscribe/unsubscribe 및 전송에서 resolveTopic(clubId) 사용. |
로깅/전송 변경 backend/src/main/java/moadong/club/entity/Club.java |
FirebaseMessaging.send 결과의 messageId를 변수로 캡처해 성공 로그에 포함; 실패 로그에 clubId 포함 등 전후 로그 개선. |
테스트 수정 backend/src/test/java/moadong/club/service/ClubProfileServiceDateTest.java, backend/src/test/java/moadong/club/service/RecruitmentStateCheckerTest.java |
RecruitmentStateCalculator 정적 모킹에서 인스턴스 @Mock 모킹으로 전환, 테스트 검증을 calculator.calculate 호출 중심으로 변경. |
Sequence Diagram(s)
sequenceDiagram
participant Scheduler
participant RecruitmentStateChecker
participant RecruitmentStateCalculator
participant FcmAsyncService
participant Firebase
Scheduler->>RecruitmentStateChecker: 주기적 검사 트리거
RecruitmentStateChecker->>RecruitmentStateCalculator: calculate(club, start, end)
RecruitmentStateCalculator->>RecruitmentStateCalculator: oldStatus vs newStatus 비교
alt 상태 변경
RecruitmentStateCalculator->>FcmAsyncService: build message & send(topic=resolveTopic(clubId))
FcmAsyncService->>Firebase: sendMessage / subscribe / unsubscribe
Firebase-->>FcmAsyncService: messageId / 결과
FcmAsyncService-->>RecruitmentStateCalculator: 전송 결과 전달
else 상태 동일
RecruitmentStateCalculator-->>RecruitmentStateChecker: no-op
end
Estimated code review effort
🎯 3 (Moderate) | ⏱️ ~25 minutes
Possibly related issues
- [feature] MOA-540 개발서버에서 동아리 모집 상태 변경시 라이브서버 푸시알림이 전송안되게 변경한다 #1078 — FcmTopicResolver 도입으로 환경 접두사 적용(개발→라이브 푸시 교차 방지) 목표와 직접적으로 일치합니다.
Possibly related PRs
- [fix] 스케줄러는 db를 참조하여 모집현황을 갱신한다 #401 — RecruitmentStateChecker와 RecruitmentStateCalculator의 DI 전환 흐름과 직접 연관됩니다.
- [fix] 지원서 이전 모집상태와 비교하지않고 알림을 보내는 문제를 수정한다 #832 — 모집 상태 변경 시 동일 상태일 경우 알림을 막는 로직과 관련이 깊습니다.
- [feature] React Native 알림 기능 구현 API #792 — FCM 관련 토픽/구독 로직 리팩터와 중복되는 변경점이 있습니다.
Suggested reviewers
- PororoAndFriends
- Zepelown
- alsdddk
🚥 Pre-merge checks | ✅ 4 | ❌ 1
❌ Failed checks (1 warning)
| Check name | Status | Explanation | Resolution |
|---|---|---|---|
| Docstring Coverage | Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. | Write docstrings for the functions missing them to satisfy the coverage threshold. |
✅ Passed checks (4 passed)
| Check name | Status | Explanation |
|---|---|---|
| Description Check | ✅ Passed | Check skipped - CodeRabbit’s high-level summary is enabled. |
| Title check | ✅ Passed | PR 제목은 개발서버에서 동아리 모집 상태 변경 시 라이브서버 푸시알림 전송을 방지하는 기능 추가에 관한 명확한 변경사항을 나타낸다. |
| Linked Issues check | ✅ Passed | PR의 코드 변경사항이 MOA-540 이슈의 요구사항을 충족한다. FcmTopicResolver를 추가하여 환경별 FCM 토픽에 prefix를 추가하고, RecruitmentStateCalculator를 DI 컴포넌트로 변환하여 환경별 토픽 구독/전송을 분리했다. |
| Out of Scope Changes check | ✅ Passed | 모든 변경사항이 MOA-540에서 요구한 FCM 토픽 환경별 분리 구현 범위 내에 있다. 로깅 추가 및 테스트 업데이트는 해당 구현을 지원하는 범위 내 변경이다. |
✏️ Tip: You can configure your own custom pre-merge checks in the settings.
✨ Finishing touches
- 📝 Generate docstrings
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.
Comment @coderabbitai help to get the list of available commands and usage tips.
Test Results75 tests 70 ✅ 18s ⏱️ For more details on these failures, see this check. Results for commit 773bada. ♻️ This comment has been updated with latest results. |
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Fix all issues with AI agents
In `@backend/src/main/java/moadong/fcm/util/FcmTopicResolver.java`:
- Around line 9-16: The resolveTopic method in FcmTopicResolver uses the raw
activeProfile value which may contain comma-separated profiles; change
resolveTopic to parse activeProfile (split on ',' and trim) then decide: if the
parsed list contains "prod" or its first non-empty profile equals "prod" return
clubId, otherwise prefix the selected profile (first non-empty profile) to
clubId; update references to activeProfile in resolveTopic to use the
parsed/normalized profile value to avoid producing names like
"prod,aws_{clubId}".
🧹 Nitpick comments (1)
backend/src/main/java/moadong/club/entity/Club.java (1)
147-155: 로깅 추가는 PR 목표에 부합합니다.FCM 알림 전송의 시작, 성공, 실패 상태를 추적할 수 있는 로깅이 잘 추가되었습니다.
messageId를 캡처하여 로깅하는 것은 디버깅 및 알림 추적에 유용합니다.선택적 개선 사항: 현재 예외가 로그만 남기고 조용히 무시되고 있어서 호출자가 알림 전송 성공 여부를 알 수 없습니다. 필요시 성공/실패를 반환하는 것을 고려해 볼 수 있습니다.
선택적 개선: 성공 여부 반환
- public void sendPushNotification(Message message) { + public boolean sendPushNotification(Message message) { try { log.info("FCM 알림 전송 시작 - clubId: {}, clubName: {}", this.id, this.name); String messageId = FirebaseMessaging.getInstance().send(message); log.info("FCM 알림 전송 성공 - clubId: {}, messageId: {}", this.id, messageId); + return true; } catch (FirebaseMessagingException e) { log.error("FCM 알림 전송 실패 - clubId: {}, error: {}", this.id, e.getMessage()); + return false; } }
#️⃣연관된 이슈
#1078
📝작업 내용
로컬, 스테이징, 프로덕션으로 나눠 fcm 메시지 전송에 영향이 가지않게 변경
fcm 전송시 로깅 추가
중점적으로 리뷰받고 싶은 부분(선택)
논의하고 싶은 부분(선택)
🫡 참고사항
Summary by CodeRabbit
릴리스 노트
개선사항
테스트
✏️ Tip: You can customize this high-level summary in your review settings.