Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Feat]#238 feature: 전체 푸시알림메시지 발송 #239

Merged
merged 2 commits into from
Mar 13, 2024
Merged

Conversation

sss4920
Copy link
Contributor

@sss4920 sss4920 commented Mar 6, 2024

🚩 관련 이슈

📋 구현 기능 명세

  • 전체에게 푸시알림 발송

📌 PR Point

  • 무슨 이유로 어떻게 코드를 변경했는지
    fcm service에 모두 작성할 수도 있었지만, 전체적으로 fcm을 발송하거나 배치 단위로 하는 작업들을 대상으로 메소드들을 추가하는 경우가 생긴다면 리팩토링에 어려움을 겪을 것 같아서 따로 분리시켰습니다.

  • 어떤 부분에 리뷰어가 집중해야 하는지
    예외 케이스가 있을지를 같이 찾아줬으면 합니다. 실행을 시켰을 때 에러가 뜨는 경우들은 다음과 같았습니다.
    테스트 db기준으로

  1. 토큰이 null일 때
    2.토큰에 test와 같이 그냥 user생성을 할때 넣어놓은 문자열로 인해
    3.토큰값이 이상할때 -> 예상으로는 만료가 되거나 기기가 변경되면 다른 로직이 있는건지 이부분을 확인하기 어렵습니다.

그래서 일단 토큰이 null일 때 경우만 걸러내도록 repository단에서 걸렀고 프로덕션상황에서 이상한 문자열을 fcm으로 넣을 수 있는 가능성이 없어서 일단 처리안했습니다.

  • 개발하면서 어떤 점이 궁금했는지
    제가 알기로는 serializable등을 쓰는 것은 다른 서버등으로 요청할 때 그쪽 서버에서 java가 아니라 다른 언어일 경우 공통으로 쓰는 String이라든가 이런 애들은 자동으로 맵핑되지만 HashMap<>이라든가 이러한 형태를 읽을 수 없을 때 그쪽에서도 이해할 수 있도록 해주는 것으로 알고 있습니다. 그래서 이번에 만든 dto는 List를 썼기에 상관없을 것이라고 생각해서 안썼는데 제대로 이해한게 맞는건지 궁금합니다.

📸 결과물 스크린샷

image

🛠️ 테스트

  • 테스트

🚀 API Endpoint

  • /broadcast/send-all

@sss4920 sss4920 added soohyun develop soohyun things Feat important things labels Mar 6, 2024
@sss4920 sss4920 self-assigned this Mar 6, 2024
@alpha-kwhn
Copy link
Contributor

3.토큰값이 이상할때 -> 예상으로는 만료가 되거나 기기가 변경되면 다른 로직이 있는건지 이부분을 확인하기 어렵습니다.

이 부분은 추후 iOS 코드 제가한번 봐볼께요!

@alpha-kwhn
Copy link
Contributor

그리고 이건.. 제가 이해해본 FCM 기반 푸시알림 동작과정인데.. 첨언이나 잘못된부분 알려주시면 감사하겠습니다..!ㅎㅋ

클라가 앱이랑 연동시켜서 로그인/아웃시에 FCM 토큰 전송

  • 로그인 시에는 새로 발급받은 FCM 토큰을 전송해줌으로써 타임스탬프 갱신?

피드 좋아요, 댓글시에 전송

⇒ 좋아요, 댓글 한 사람이 FCM 토큰을 가지고 있을경우 (디비 탐색)

⇒ 푸시알림에 들어갈 내용 Notification 객체에 담아 생성후 메시지큐에 푸쉬

⇒ 좋아요이냐 댓글이냐 MessageSender에서 판별하여 큐에 넣음

⇒ @RabbitListener 어노테이션이 달린 메서드에서 enque를 인식

⇒ fcmService의 sendByToken 메서드를 통해 비동기로 알림발송

⇒ 파이어베이스 서버로 푸시알림 메시지 전송함

⇒ GoogleCredential 활용하여 파이어베이스 서버 액세스 토큰을 가져와서 담고

⇒ HttpHeader 잘 갖춰서 요청 보내고 리스폰스를 받아옴

⇒ response 리턴

⇒ MessageReceiver에서 response를 체크하여 오류가 없는가 확인 진행

@sss4920
Copy link
Contributor Author

sss4920 commented Mar 7, 2024

⇒ MessageReceiver에서 response를 체크하여 오류가 없는가 확인 진행

오 거의 정확하지만 이 부분이

⇒ @RabbitListener 어노테이션이 달린 메서드에서 enque를 인식

이 부분의 다음으로 와서 실행된다고 이해하시면 될 것 같아요!
우리가 messageQueue로 쏘고나면 여유가 남는 리소스가 messageQueueReceiver에서 response를 검사하고 푸시알림 과정을 진행하는 플로우 인겁니다!

Copy link
Contributor

@funnysunny08 funnysunny08 left a comment

Choose a reason for hiding this comment

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

개고수,,👍

private final UserRepository userRepository;

public ApiResponse broadAllUser(BroadCastAllUserDto broadCastAllUserDto) throws
JsonProcessingException,
Copy link
Contributor

Choose a reason for hiding this comment

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

그냥 궁금한건데, 해당 에러를 컨트롤러 단으로 던지는 이유가 궁금합니다!

Copy link
Contributor Author

Choose a reason for hiding this comment

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

헉..! 보통 try-catch문으로 안에서 잡는 방식으로 작성해왔던 것 같은데 이 부분을 생각 못했네용..! 수정해보겠습니당💦

src/main/java/org/winey/server/service/FcmService.java Outdated Show resolved Hide resolved

System.out.println("List of tokens that caused failures: " + failedTokens);
}
return CompletableFuture.completedFuture(response);
Copy link
Contributor

Choose a reason for hiding this comment

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

제가 CompletableFuture를 처음 봐서 검색해봤는데 반환된 Future를 기반으로 외부에서 작업을 완료하거나 추가하거나 그러는 것 같더라구요.. 여기서는 어떻게 사용하는 건가용..??!

Copy link
Contributor Author

Choose a reason for hiding this comment

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

일단 결론부터 말씀드리면 비동기식으로 구현해야할지 동기식으로 그냥 구현해도 될지에 대해서 고민을 하는 과정이 있었는데요. 다음과 같은 코드는 비동기식으로 구현을 한다고 가정을 했을 때의 오류를 컨트롤하고싶어서 만들어놨다가 뇌정지가 온 모습입니다.. ㅜ
저의 얕은 지식으로 알기로는 비동기식으로 구현을 하게되면 그냥 보통의 return값을 선언했을 때 이후의 예외처리를 할 수 없다고? 알고있었습니다.(다른 방식이 있을 수도 있을 것 같습니다..ㅜ) timeOut으로 종료되는 것이 아니면 외부에서 종료시킬 수도 없어서 저것을 사용하면 비동기작업인데도 불구하고 어떤 에러가 발생했을 때 그 에러를 서비스단으로 반환시켜서 그랬을 때의 에러를 서비스단에서 핸들링하던가 하고싶었는데 저희가 기획에서 요청을 받으면 그 때만 보내는 것이기에 비동기로 하는 것이 맞을지에 대해서도 의문이라서 저도 다른 의견들이 궁금합니다. (동기식으로 그냥 구현해도 상관없을 것 같다면 그냥 빼도 될 것 같습니다!) 저도 비동기와 관련된 내용들은 CS지식이 많이 부족하기 때문에 이참에 더 공부해보도록 할게요 ㅜ

Copy link
Contributor Author

@sss4920 sss4920 left a comment

Choose a reason for hiding this comment

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

바쁠텐데 리뷰 남겨줘서 고맙숩니당 ㅜ

private final UserRepository userRepository;

public ApiResponse broadAllUser(BroadCastAllUserDto broadCastAllUserDto) throws
JsonProcessingException,
Copy link
Contributor Author

Choose a reason for hiding this comment

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

헉..! 보통 try-catch문으로 안에서 잡는 방식으로 작성해왔던 것 같은데 이 부분을 생각 못했네용..! 수정해보겠습니당💦

src/main/java/org/winey/server/service/FcmService.java Outdated Show resolved Hide resolved

System.out.println("List of tokens that caused failures: " + failedTokens);
}
return CompletableFuture.completedFuture(response);
Copy link
Contributor Author

Choose a reason for hiding this comment

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

일단 결론부터 말씀드리면 비동기식으로 구현해야할지 동기식으로 그냥 구현해도 될지에 대해서 고민을 하는 과정이 있었는데요. 다음과 같은 코드는 비동기식으로 구현을 한다고 가정을 했을 때의 오류를 컨트롤하고싶어서 만들어놨다가 뇌정지가 온 모습입니다.. ㅜ
저의 얕은 지식으로 알기로는 비동기식으로 구현을 하게되면 그냥 보통의 return값을 선언했을 때 이후의 예외처리를 할 수 없다고? 알고있었습니다.(다른 방식이 있을 수도 있을 것 같습니다..ㅜ) timeOut으로 종료되는 것이 아니면 외부에서 종료시킬 수도 없어서 저것을 사용하면 비동기작업인데도 불구하고 어떤 에러가 발생했을 때 그 에러를 서비스단으로 반환시켜서 그랬을 때의 에러를 서비스단에서 핸들링하던가 하고싶었는데 저희가 기획에서 요청을 받으면 그 때만 보내는 것이기에 비동기로 하는 것이 맞을지에 대해서도 의문이라서 저도 다른 의견들이 궁금합니다. (동기식으로 그냥 구현해도 상관없을 것 같다면 그냥 빼도 될 것 같습니다!) 저도 비동기와 관련된 내용들은 CS지식이 많이 부족하기 때문에 이참에 더 공부해보도록 할게요 ㅜ

@sss4920 sss4920 merged commit d143603 into dev Mar 13, 2024
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Feat important things soohyun develop soohyun things
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[Feat] 전체 푸시알림 전송 API 설계
3 participants