donghL-dev / blog-comments

0 stars 0 forks source link

Firebase-Cloud-Messaging #8

Open utterances-bot opened 3 years ago

utterances-bot commented 3 years ago

[Firebase] FCM에 대해서 알아보자. 🔔

이 블로그는 제가 개발 또는 공부를 하면서 느낀점 또는 공부 내용을 정리한 내용을 게시하거나 제가 경험했던 내용 또는 제 관심사에 대한 내용들을 게시하기 위한 공간입니다.

https://donghun.dev/Firebase-Cloud-Messaging

jh0290 commented 3 years ago

정성이 들어간 글이네요. 감사합니다!

yoonjishin-dev commented 3 years ago

안녕하세요! 궁금한 것이 있어서요 FCM 클라우드 메시지가 처리되는 과정의 그림에서 화살표 방향은 맞는데 실행 순서?(숫자)가 맞나요? 제가 이해한바로는 현재 그림상 1-3-4-2 순으로 처리되거든요 제가 잘못이해한건지 알려주시면 감사하겠습니다

donghL-dev commented 3 years ago

@tlsdbswl 님, 반갑습니다.

본문의 FCM 클라우드 메시지의 흐름 부분에 내용을 기재해두었지만, 다시 한 번 쉽게 말씀드리도록 하겠습니다. 질문주신 내용에 대해 결론부터 말씀드리자면, 1 -> 2 -> 3 -> 4의 과정이 반은 맞고 반은 틀립니다. 질문주신 내용으로 미루어 보았을 때, 1 -> 3 -> 4 -> 2 의 과정으로 생각하신 이유가 이를 연속된 과정이라고 생각하셨을거라 이해하였습니다. 반은 맞고 반은 틀리다고 했던 이유가 1 -> 2 과정과 3 -> 4 의 과정이 연속적이지 않고 분리되어 있기 때문입니다. 하지만 통상적인 프로세스 설명을 위해 본문과 같이 기재하였습니다.

1번의 과정은 앱서버에서 FCM Backend 서버로 메세지를 전송해달라고 요청을 보내는 부분입니다. 2번의 과정은 FCM Backend 서버가 1번에서 보낸 요청을 문제없이 잘 받았다고 보낸 HTTP Response 입니다. 그 이후에 FCM Backend 서버에서 3번의 과정을 통해 안드로이드 앱에 메세지를 발송하고, 안드로이드 앱에선 4번의 과정을 통해 메세지를 잘 받았다는 ACK를 FCM Backend 서버에게 보내고 있습니다.

즉, 정리하면 앱 서버는 1번의 과정을 통해 FCM Backend 서버에게 메세지 발송을 요청할 순 있지만, 그 요청된 메세지 발송 건이 즉시 수행되지는 않습니다. 실질적인 처리는 FCM Backend 내부 처리 방식에 따라 처리됩니다. 그렇기에 메세지 발송 요청을 받고 잘 받았다는 응답을 2번 과정을 통해서 내려주고, 내부 규약에 맞게 일정 부분 대기를 하게 됩니다. 물론, 실시간에 가까운 처리가 이루어지긴 하곘으나 그 순간이 매번 보장 되지는 않을 것이기 때문에 "즉시"라는 표현을 사용하지 않았습니다. 그렇기 때문에, 메세지 전송을 위한 요청과 응답, 실제 전송과 응답은 구분되어 있다는 것을 말씀드린 것 이었습니다. 전송을 위한 요청과 응답이 1번과 2번 과정, 실제 전송과 응답이 3번과 4번의 과정이라고 생각하시면 이해가 어렵지 않을 것이라 생각됩니다. 충분한 답변이 되었을지 모르겠네요!

yoonjishin-dev commented 3 years ago

@donghL-dev 네 완전 이해가 되었습니다! 감사합니다

Robin-park commented 1 year ago

많은 도움이 되었습니다. 감사합니다.

jjungsk commented 1 year ago

안녕하세요 좋은 글 잘 보았습니다^^ 다름이 아니라 FCM 실습 중에 FirebaseMessaging.getInstance().send(message); 로 날리고 싶은데 이때 access token 은 어떻게 담아서 보내셨나요??

현재는 FCM Config 설정은 따로 해주었고 FcmService 에서 GoogleCredentials 에서 access token을 받아와서 Request 에서 Header에 Authorization 에 access token을 담아 OkHttpClient 로 요청 중입니다.

donghL-dev commented 1 year ago

@jjungsk 님, 반갑습니다.

본문에 나와있는 것처럼 저는 access token 을 따로 받아와서 사용하지 않았고, Google Cloud Platform 서비스 계정을 만들고, 해당 계정의 권한에 FIrebase 쪽 권한까지 추가시켜준 뒤, 해당 서비스 계정의 권한 파일을 credentail file로 만들어서 해당 파일을 Firebase 인스턴스 초기화 시 적용 시켜서 진행했었습니다. 그 이외의 인증 방법은 공식문서를 참고하시면 도움이 되실듯 합니다. 서비스 계정을 이용한 인증 방법 관련 문서는 링크를 확인해보시면 될 것 같습니다.

여담 으로는 제가 연동했을 당시에는 Firebase 쪽에서 SDK를 사용한 연동법을 권장했고, API를 통한 형식으로 요청하는 것은 레거시 이기에 크게 권장하지 않는다고 했었던 것 같습니다. 아마 그 이유가 말씀해주신 문제처럼 인증된 API를 호출하는게 번거롭거나 이후 트러블슈팅의 원인이 될 수 있었던 것 같습니다. 크게 도움을 드리지 못한 것 같아 죄송합니다.

위 두 방법(SDK 이용, Access Token을 이용한 API 호출 이용)을 포함한 공식 문서 링크 또한 같이 남겨 드리겠습니다. 도움이 되시면 좋을 것 같네요.

감사합니다.

jjungsk commented 1 year ago

@donghL-dev 님 바쁘신 와중에 답변 정말 감사합니다^^ 제가 GCP를 안써 봐서 헷갈렸었습니다. 덕분에 많은 도움이 되었습니다 감사합니다!