8000 [Feature] 스케줄러에 FCM 발송 payload(제목/본문/리다이렉트 URL) 추가 by qkrcodus · Pull Request #55 · If-u-Lab/If-u-server · GitHub
[go: up one dir, main page]

Skip to content

[Feature] 스케줄러에 FCM 발송 payload(제목/본문/리다이렉트 URL) 추가 - #55

Merged
qkrcodus merged 6 commits into
devfrom
feat/today-question-push-payload
Jan 3, 2026
Merged

qkrcodus merged 6 commits into
devfrom
feat/today-question-push-payload

Conversation

@qkrcodus
@qkrcodus qkrcodus commented Jan 2, 2026 •
Copy link
Copy Markdown
Member

🔗 Issue Link

#54

🎯 What I Did

  • 스케줄러에 FCM 발송 payload(제목/본문/리다이렉트 URL) 추가
  • 알림 테스트 api 요청 dto, 응답 dto 수정

🧪 API Test Scenarios

테스트한 엔드포인트

  • /api/v1/notifications/test

테스트 시나리오

  1. 정상 플로우

dryRun:True
스크린샷 2026-01-02 오후 7 22 28

dryRun:False
스크린샷 2026-01-02 오후 7 23 01

@qkrcodus qkrcodus self-assigned this Jan 2, 2026
@qkrcodus qkrcodus added the enhancement New feature or request label Jan 2, 2026
@qkrcodus qkrcodus linked an issue Jan 2, 2026 that may be closed by this pull request
2 tasks done
@gemini-code-assist
Copy link
Copy Markdown

Summary of Changes

Hello @qkrcodus, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

이 PR은 스케줄러 기반의 푸시 알림 시스템을 개선í• 8000 ˜여 FCM 메시지에 리다이렉트 URL을 포함하도록 확장합니다. 이를 통해 사용자는 알림을 통해 특정 콘텐츠로 직접 이동할 수 있게 됩니다. 또한, 알림 테스트 API는 오늘의 질문 데이터를 자동으로 활용하도록 재구성되어, 테스트의 편의성과 실제 알림 내용과의 일관성을 높였습니다.

Highlights

  • FCM 알림에 리다이렉트 URL 추가: 스케줄러를 통해 발송되는 FCM 알림에 리다이렉트 URL을 포함하도록 기능이 확장되어, 사용자가 알림을 탭했을 때 특정 경로로 이동할 수 있게 되었습니다.
  • 알림 테스트 API 개선: 알림 테스트 API (/api/v1/notifications/test)가 이제 오늘의 질문 데이터를 기반으로 알림을 생성하며, 요청 시 제목과 본문을 직접 지정할 필요가 없어졌습니다. 이는 테스트 프로세스를 간소화하고 실제 알림 내용과의 일관성을 보장합니다.
  • 알림 DTO 변경: PushNotificationTestRequest에서 제목과 본문 필드가 제거되었고, PushNotificationTestResponse에는 제목, 본문, 리다이렉트 URL 필드가 추가되어 알림 테스트 응답이 더욱 상세해졌습니다.
  • 스케줄러 알림 제목 변경: 스케줄러에서 발송하는 알림의 기본 제목이 '새로운 질문이 도착했어요!'에서 '오늘의 질문 공개'로 변경되었습니다.

🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console.

Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution. ↩

@claude
claude Bot commented Jan 2, 2026
Copy link
Copy Markdown

PR 리뷰

전반적으로 FCM payload 추가 작업이 잘 구현되었습니다. 테스트 API가 실제 오늘의 질문 데이터를 사용하도록 개선된 점이 좋습니다.

P2 (적극적으로 고려해주세요)

  • PushNotificationService.java:38 - com.ifu.ifu_server.domain.question.repository.QuestionRepository 대신 import 문을 사용하여 FQCN(Fully Qualified Class Name)을 제거해주세요. 가독성이 떨어집니다.

  • PushNotificationService.java:192-194 - java.time.LocalDateTime 역시 import로 처리하여 FQCN 제거 필요합니다.

  • PushNotificationService.java:30-31, PushNotificationScheduler.java:22-23 - NOTIFICATION_TITLE과 REDIRECT_PATH 상수가 두 클래스에 중복 정의되어 있습니다. 공통 상수 클래스로 추출하거나 설정 파일(application.yml)로 외부화하는 것을 권장합니다.

P3 (웬만하면 반영해주세요)

  • PushNotificationService.java:195-200 - 오늘의 질문 조회 로직이 sendTestNotification에 직접 포함되어 있습니다. QuestionService에 getTodayPublishedQuestion() 같은 메서드를 만들어 비즈니스 로직을 분리하는 것이 좋습니다.

  • PushNotificationService.java:191-200 - 오늘의 질문이 없는 경우 테스트 알림을 보낼 수 없게 되는데, 이 제약사항이 의도된 것인지 확인 필요합니다. 테스트 목적이라면 fallback 메시지를 제공하는 것도 고려해볼 수 있습니다.

  • 테스트 API 응답에 redirectUrl 필드가 추가되었는데, 프론트엔드에서 이 경로를 어떻게 처리할지에 대한 문서화가 필요합니다. (예: 상대경로인지, 절대경로인지, 앱 내 라우팅 경로인지)

P4 (반영해도 좋고 넘어가도 좋습니다)

  • PushNotificationTestRequest.java - title, body 필드가 제거되면서 주석도 함께 정리되었는지 확인해주세요.

  • NotificationController.java:39 - "dry run" 표기 스타일: "dry run" vs "dryRun" 중 하나로 통일하면 좋습니다.

@gemini-code-assist gemini-code-assist Bot left a comment
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

이번 PR은 FCM 푸시 알림에 제목, 본문, 리다이렉트 URL 페이로드를 추가하고, 테스트 알림 API를 수정하는 내용입니다. 전반적으로 기능 구현은 잘 되었으나, 코드의 유지보수성과 테스트 용이성을 높이기 위해 몇 가지 개선점을 제안합니다. 주요 내용으로는 중복된 상수 관리, 테스트를 위한 시간 값 처리 방식 개선, 코드 가독성을 위한 FQCN(Fully Qualified Class Name) 사용 지양, 그리고 문자열 검증 방식 개선이 있습니다.

@claude
claude Bot commented Jan 3, 2026
Copy link
Copy Markdown

PR 리뷰

전체적으로 FCM 발송에 redirect URL을 추가하고 테스트 API를 실제 질문 데이터 기반으로 개선한 좋은 변경입니다. 몇 가지 개선사항을 제안합니다.

P2 (적극적으로 고려해주세요)

  • PushNotificationService.java:198-209 - sendTestNotification()에서 오늘의 질문을 조회하는 로직이 중복되고 있습니다. 스케줄러는 findPendingNotificationQuestion()을, 테스트는 findByStatusAndPublishDateBetween()을 사용하는데, 같은 "오늘의 질문"을 조회하는 의도라면 로직을 통일하는 것이 좋습니다. 시간 범위 계산(startOfDay, endOfDay)도 중복 코드입니다.

  • PushNotificationService.java:198 - Clock 주입은 좋지만 스케줄러에서는 LocalDateTime.now()를 직접 호출하고 있어 일관성이 없습니다. PushNotificationScheduler.java:36도 Clock을 주입받아 사용하는 것이 테스트 가능성과 일관성 측면에서 권장됩니다.

  • PushNotificationService.java:201-206 - 오늘의 질문이 없을 경우 QUESTION_NOT_FOUND 예외가 발생하는데, 테스트 API에서 이런 상황이 발생하면 사용자에게 불친절합니다. "오늘 발행된 질문이 없습니다" 같은 더 구체적인 에러 메시지나 별도 ErrorCode를 고려해주세요.

P3 (웬만하면 반영해주세요)

  • PushNotificationService.java:35-36 - 테스트 전용 상수(NOTIFICATION_TEST_TITLE, REDIRECT_TEST_PATH)와 실제 발송용 상수(PushNotificationScheduler.java:22-23)가 중복 정의되어 있습니다. 알림 제목이나 경로 변경 시 두 곳을 모두 수정해야 하므로 한 곳에서 관리하는 것이 좋습니다.

  • PushNotificationService.java:127-129 - redirectPath null 체크 시 !redirectPath.isBlank()를 사용하고 있는데, JavaDoc에서는 "nullable"로만 표시되어 있습니다. 빈 문자열 처리가 의도된 것이라면 JavaDoc에 명시(@param redirectPath 리다이렉트 경로 (null 또는 빈 문자열이면 생략))하는 것이 좋습니다.

  • 테스트 파일이 없습니다. FCM 연동 로직의 복잡도를 고려하면 최소한 mock 기반 단위 테스트 추가를 권장합니다. 특히 sendTestNotification()의 질문 조회 로직과 dryRun 분기는 테스트하기 좋은 대상입니다.

P4 (반영해도 좋고 넘어가도 좋습니다)

  • NotificationController.java:39 - 응답 메시지를 "테스트 알림 검증이 완료되었습니다"에서 "테스트 알림 dryRun이 완료되었습니다"로 변경했는데, 일반 사용자는 "dryRun"이라는 기술 용어에 익숙하지 않을 수 있습니다. "실제 전송 안됨" 부분이 충분히 설명하고 있어 큰 문제는 아닙니다.

긍정적인 부분

  • FCM 메시지에 redirectUrl data 필드를 추가하여 클라이언트가 알림 클릭 시 적절한 화면으로 이동할 수 있게 개선했습니다.
  • 테스트 API가 실제 오늘의 질문 데이터를 사용하도록 변경하여 프로덕션 환경과 동일한 조건에서 테스트할 수 있게 되었습니다.

@claude
claude Bot commented Jan 3, 2026
Copy link
Copy Markdown

PR 리뷰

전반적으로 FCM payload에 제목/본문/리다이렉트 URL을 추가하는 기능이 잘 구현되었습니다. Clock 주입을 통한 테스트 가능성도 좋습니다.

P2 (적극적으로 고려해주세요)

  • PushNotificationService.java:248-259 - getTodayQuestion() 메서드의 날짜 범위 로직에 문제가 있습니다. endOfDay는 다음날 00:00:00인데 publishAt < endOfDay 조건을 사용하면 23:59:59까지의 질문만 조회됩니다. 하지만 실제로 publishAt이 00:00:00에 정확히 설정된 질문은 제외될 수 있습니다. 만약 오늘 자정 00:00:00에 발행된 질문이 있다면 올바르게 조회되는지 확인이 필요합니다.

  • PushNotificationService.java:253-257 - QuestionRepository.findByStatusAndPublishDateBetween() 쿼리와 getTodayQuestion() 간의 의미 불일치가 있습니다. 메서드명은 "PublishDate"인데 실제로는 publishAt 필드(시간 포함)를 사용합니다. "오늘의 질문"을 조회할 때 발행 날짜만 비교하려는 의도라면 메서드명을 findByStatusAndPublishAtBetween으로 변경하거나, 쿼리 로직을 날짜만 비교하도록 수정하는 것이 좋습니다.

  • PushNotificationService.java:182-240 - sendTestNotification() 메서드에서 오늘의 질문이 없을 경우 예외가 발생합니다. 테스트 API가 오늘의 질문 유무에 의존하는 것은 테스트 목적상 부적절할 수 있습니다. 오늘의 질문이 없어도 테스트 알림을 발송할 수 있도록 fallback 메시지를 제공하거나, 별도의 테스트용 메시지를 사용하는 것이 좋습니다.

P3 (웬만하면 반영해주세요)

  • PushNotificationService.java:182-240, PushNotificationScheduler.java:35-71 - sendTestNotification() 메서드와 스케줄러의 checkAndSendNotifications() 메서드에 대한 단위 테스트가 누락되어 있습니다. 특히 오늘의 질문 조회 로직과 리다이렉트 URL 포함 여부를 검증하는 테스트 추가를 권장합니다.

  • QuestionRepository.java:29-32 - findByStatusAndPublishDateBetween() 메서드가 Optional<Question>을 반환하지만, 같은 날짜에 여러 질문이 발행될 가능성이 있습니다. ORDER BY q.publishAt DESC로 정렬하므로 최근 질문 1개만 반환되는데, 이것이 의도된 동작인지 명확하지 않습니다. 메서드 JavaDoc에 "가장 최근에 발행된 질문 1개 반환" 같은 설명 추가를 권장합니다.

P4 (반영해도 좋고 넘어가도 좋습니다)

  • NotificationController.java:39 - 메시지 오타: "검증이 완료되었습니다" → "dryRun이 완료되었습니다"로 수정되었는데, "dryRun 검증이 완료되었습니다"가 더 자연스러울 수 있습니다.

  • PushNotificationService.java:124 - sendBatch() 메서드의 파라미터 순서를 통일성 있게 유지하세요. title, body, redirectPath, tokens 순서가 일관되게 사용되고 있어 좋습니다.

@qkrcodus
qkrcodus merged commit 722e819 into dev Jan 3, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature] 스케줄러에 FCM 발송 payload(제목/본문/리다이렉트 URL) 추가

1 participant

0