FCM 메시지 수신하는 방법은 다음 링크를 참고하세요.

 

이 글에서는 FCM 메시지를 전송하는 방법 설명과 푸시 서버 아키텍처를 제안합니다.

  • FCM 전송하기
  • 푸시 서버 아키텍처 제안

 

FCM 전송하기

FCM 전송은 v1 HTTP 프로토콜(Admin SDK 이용)과 기존 앱 서버 프로토콜 방식을 제공합니다.

 

이 글에서는 기존 앱 서버 프로토콜을 이용해 FCM 전송하도록 진행합니다.

 

 

FCM 전송 API

 

위 링크의 문서에는 다음과 같은 요청으로 FCM을 전송합니다.

 

주요 항목은 다음과 같습니다.

 URI

 https://fcm.googleapis.com/fcm/send

 HTTP Method

 POST

 Header

 Authorization: key={프로젝트 서버 키}

 Content-Type=application/json

 Body 

 전송 데이터 JSON 포맷(Firebase 문서)

 {

   "to": "{디바이스 Firebase 토큰}", 

   "priority": "high",

   "notification": {

     "title": "{알림센터 제목}", 

     "body": "{알림센터 내용}"

   }, 

   "data":{

     // 사용자 정의 데이터

   }

 }

 

프로젝트 서버 키는 구글 Firebase 콘솔 의 프로젝트 설정 > 클라우드 메시징 화면에서 확인할 수 있습니다.

 

 

디바이스 Firebase 토큰은 안드로이드 앱에서 푸시 서비스와 연결 후 취득한 값입니다.

 

FCM 전송 구현

 위 내용을 구현한 화면은 다음과 같습니다.

 

구현된 코드는 다음과 같습니다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
procedure TForm1.Button1Click(Sender: TObject);
var
  JsonBody: TJSONObject;
begin
  RESTClient1.BaseURL := 'https://fcm.googleapis.com/fcm/send';
  RESTClient1.ContentType := 'application/json';
 
  RESTRequest1.Method := rmPOST;
 
  RESTRequest1.Params.AddItem('Authorization', 'key=' + edtServerKey.Text, pkHTTPHEADER, [poDoNotEncode]);
 
  RESTRequest1.ClearBody;
  JsonBody := GetFcmJsonData(edtToken.Text, edtTitle.Text, edtMessage.Text, edtData.Text);
  RESTRequest1.Body.Add(JsonBody);
  JsonBody.Free;
  RESTRequest1.Execute;
 
  Label1.Text := RESTResponse1.StatusCode.ToString + ' ' + RESTResponse1.StatusText;
  Memo1.Lines.Text := RESTResponse1.Content;
end;
 
function TForm1.GetFcmJsonData(AClientToken, ATitle, AMessage,
  AData: string): TJSONObject;
var
  Noti, Data: TJSONObject;
begin
  Result := TJsonObject.Create
    .AddPair('to', AClientToken)
    .AddPair('priority', 'high');
  Result.AddPair('notification',
    TJsonObject.Create
      .AddPair('title', ATitle)
      .AddPair('body', AMessage));
  Result.AddPair('data',
    TJSONObject.Create
      .AddPair('title', ATitle)
      .AddPair('body', AMessage)
      .AddPair('custompayload', AData));
end;

 

 

GetFcmJsonData 메소드에서 만드는 전송 데이터(JSON)의 "notification" 항목은 알림센터에 표시되는 내용입니다.

"data" 항목은 커스텀하게 구조 및 내용을 지정해 전달하면 그대로 전달됩니다. data의 title, body를 중복해 입력한 이유는 아래에서 다시 설명합니다.

 

위 구현은 윈도우 클라이언트로 진행했습니다. 하지만, 다른 플랫폼과 다른 프로젝트(RAD 서버, 데이터스냅 등)에서도 동일한 방식으로 구현가능합니다.

 

전송 결과

 

전송 시 위와 같이 전송 결과를 수신합니다.

 

현재는 전송대상을 특정 대상 하나로 지정했지만, 전송 데이터의 registration_idx  속성에 전송대상을 배열로 지정해 복수의 대상에게 전송할수도 있습니다. 자세한 전송 프로토콜은 아래 문서를 참고하시기 바랍니다.

 

FCM 클라이언트 수신

구현한 내용으로 FCM 전송 시 구글 FCM 서비스를 통해 기기로 메시지가 전달됩니다.

앱이 활성화 되어 있으면 OnReceiveNotification 이벤트를 통해 전달된 메시지를 수신할 수 있습니다.

앱이 활성화 되어 있지않다면, PushService.StartupNotifications 속성을 통해 메시지를 수신할 수 있습니다.

 

여기서 한가지 문제는 앞의 두가지 상태에서 수신된 데이터에 약간의 차이가 있다는 것입니다.
그 차이는 gcm.notification.title과 gcm.notification.body 정보의 유무입니다.

 앱이 활성화된 상태의 수신 데이터

 앱이 활성화되지 않은 상태의 수신 데이터

 

 

위의 수신데이터의 "title"과 "body"항목은 제가 전송시 일부로 추가한 내용입니다. 해당 항목이 없다면 비활성화 상태의 수신데이터에서는 제목과 내용은 알수 없을 것입니다.(사실 몰라도 될 수 있습니다.^^)

 

전송부에서 추가한 항목은 "title", "body", "custompayload"입니다. 전송 시 "data" 속성 하위에 추가한 정보들이 메시지에 함께 전달되는 것을 확인할 수 있습니다. 자식객체를 추가해 계층으로 데이터를 구성할 수도 있습니다.

 

이 매커니즘을 활용해 필요한 데이터 형식으로 메시지를 전송하도록 합니다.

 

 

FCM 전송 아키텍처 제안

앞에서 구현한 전송 프로그램은 디바이스 Firebase 토큰을 입력받아 진행합니다. 하지만 실제 서비스에서는 토큰을 수집하는 매커니즘이 필요합니다.

 

보통, 서버를 하나 두고 디바이스에서 취득한 토큰을 서버를 통해 저장 및 관리 후 저장된 토큰을 이용해 메시지를 전송해야 할 것입니다.

 

위 과정을 생각하다보니, 간단한 푸시 메시지 서버 제작도 가능할 것 같아 그려본 아키텍처를 소개합니다.

 

 

푸시 서버 아키텍처 구성

 

 

구성요소

  • 안드로이드 앱 : FMX 기반 앱, 푸시 서버에 따라 iOS, 윈도우 등 확장 가능
  • 관리자 앱 : 푸시 메시지를 전송하는 관리자용 앱
  • 서버 : 모노리틱 또는 마이크로 서비스 기반
    • Auth 서비스 : 인증 기능을 제공하는 서비스. 여기서는 인증 시 토큰을 받아 저장
    • Push 서비스 : 푸시 서비스 제공
  • DBMS
  • 구글 FCM 서비스

 

처리 흐름

  1. 앱에서 사용자 인증(또는 초기화) 시 Firebase 토큰을 전달
  2. 사용자 정보와 매핑되도록 토큰을 DB에 저장
  3. 관리자 앱에서 사용자 정보 조회
  4. 푸시 서비스에 푸시 요청. 대상으로 사용자 키값 지정
  5. 사용자 키값과 매핑되는 토큰으로 FCM 전송 요청
  6. 앱에서 푸시 수신
  7. 푸시 전송 결과 응답
  8. (옵션)전송 결과 저장

 

위 아키텍처는 RAD 서버를 이용해 마이크로 서비스 아키텍처로 구현하면 좋을 것 같습니다.

물론 데이터 스냅, WebBroker 등의 다른 백엔드 기술을 이용해도 구현가능합니다.

 

위 아키텍처는 확장가능합니다.

현재는 안드로이드 앱으로 한정지었지만, iOS 앱 또는 윈도우 앱으로 확장가능합니다.

현재는 푸시 서비스를 구글 FCM 서비스로 한정지었지만, 다른 푸시 서비스로 병렬로 운영할 수도 있습니다.

예를 들면, WNS(윈도우즈 푸시 알림 서비스)를 연동한다면 윈도우 앱을 대상으로도 푸시 메시지 전송이 가능할 것입니다.

번호 제목 글쓴이 날짜 조회 수
공지 [DelphiCon 요약] 코드사이트 로깅 실전 활용 기법 (Real-world CodeSite Logging Techniques) 관리자 2021.01.19 15545
공지 [UX Summit 요약] 오른쪽 클릭은 옳다 (Right Click is Right) 관리자 2020.11.16 13997
공지 [10.4 시드니] What's NEW! 신기능 자세히 보기 관리자 2020.05.27 16533
공지 RAD스튜디오(델파이,C++빌더) - 고객 사례 목록 관리자 2018.10.23 22110
공지 [데브기어 컨설팅] 모바일 앱 & 업그레이드 마이그레이션 [1] 관리자 2017.02.06 23366
공지 [전체 목록] 이 달의 기술자료 & 기술레터 관리자 2017.02.06 18963
공지 RAD스튜디오(델파이, C++빌더) - 시작하기 [1] 관리자 2015.06.30 39354
공지 RAD스튜디오(델파이,C++빌더) - 모바일 앱 개발 사례 (2020년 11월 업데이트 됨) 험프리 2014.01.16 174763
50 [사례 소개] 데브기어 마이그레이션 유상 컨설팅 사례 험프리 2020.04.22 553
49 인터베이스(InterBase) 2020 버전을 사용해야 하는 5 가지 이유 file 김원경 2020.04.09 6023
48 이 달의 기술자료 - 2020년 04월 험프리 2020.03.27 290
47 파이어몽키를 사용하여 멀티 플랫폼/아키텍처 용 소프트웨어 개발 file 김원경 2020.03.25 598
46 델파이 개발자 관점에서 본 윈도우 개발 file 김원경 2020.03.13 712
45 이 달의 기술자료 - 2020년 03월 file 험프리 2020.02.28 276
44 인터베이스(InterBase)와 다른 데이터베이스들의 기능 비교 file 김원경 2020.02.27 596
43 RAD 서버 완벽 가이드 - 200페이지 분량의 전자책 file 험프리 2020.02.07 751
42 3회차 "커뮤니케이션 데이 - 마이그레이션" 회고 험프리 2020.02.05 194
41 윈도우10에서 활용 가능한 델파이만의 5가지 기능들 관리자 2020.02.04 964
40 이 달의 기술자료 - 2020년 02월 험프리 2020.01.31 261
39 [발표자료] 20200130 실제 사례로 살펴보는 소프트웨어 현대화 방안 file 관리자 2020.01.31 228
38 프로젝트 경험을 통해 터득한 효과적인 마이그레이션 프로세스 file 험프리 2020.01.22 578
37 [팁] 10.3.3 AAB에서 로컬서비스 실행시 문제점 해결 방법 험프리 2020.01.02 270
36 VCL의 역할과 방향 - 마르코 칸투의 VCL 이야기! 관리자 2019.12.17 594
35 기술자료 TOP 7 - 개발자들이 가장 많이 클릭한 기술자료는? (2019년 하반기) 관리자 2019.12.05 854
» FCM 전송 구헌혀기 - 앱 서버 프로토콜 사용 메시지 전송 험프리 2019.11.08 1122
33 이 달의 기술자료 - 2019년 11월 file 험프리 2019.10.25 362
32 [발표자료] 20191017 실전 사례로 살펴보는 소프트웨어 현대화 전략 file 관리자 2019.10.23 371
31 [개발사례-유통분야] 20년된 프로그램을 현대식 마이크로서비스 아키텍처로 전환 관리자 2019.10.22 1092