FCM
FCM은 Firebase Cloud Messaging의 약자로, 무료로 메시지를 안정적으로 전송할 수 있는 교차 플랫폼 메시징 솔루션이다.
모든 사용자에게 알림 메세지를 전송할 수도 있고, 그룹을 지어 메시지를 전송할 수도 있다.
Firebase의 서비스는 요금 정책에 따라, 이용할 수 있는 범위가 다르지만 FCM은 요금 정책에 구분 없이 무료로 사용하는 것이 가능하다.
왜 사용하는가 ?
FCM을 이용하면 플랫폼에 종송되지 않고 푸쉬 메시지를 전송할 수 있다
iOS, Android, Web 각 플랫폼에서 푸쉬 메시지를 보내려면
각 플랫폼 환경 iOS (APNS), Android (GCM)별로 개발해야 하는 불편함이 있는데
이를 하나로 통합하는 솔루션으로 플랫폼에 종속되지 않고 Push 메시지를 전송할 수 있다.
A→ 어플리케이션 서버 → 클라우드 메시징 서버 → B 와 같은 형태로 작업을 처리하게 된다.
클라우드 메시징 서비스를 사용하면 어떤 이점이 있는가?
서버를 경유해서 실시간으로 푸쉬 메시지를 받으려면 사용자는 항상 서버에 접속해있어야 하는데, 이는 사용자 기기의 배터리 및 네트워크 리소스를 크게 낭비한다.N
클라우드 메시징 서버를 중간에 둠으로써, 사용자는 낮은 배터리와 네트워크의 사용만으로도 메세지를 실시간으로 송수신 처리를 할 수 있다.
위와 같은 이유로 대부분의 어플리케이션 서비스들은 클라우드 메시징 서버를 경유해서, 실시간으로 유저들에게 메시지를 전송해주고 있다.
FCM의 주요 특징
메세지 타입
- FCM의 메세지 타입은 알림 메세지와 데이터 메시지로 구분할 수 있다.
- 보통 알림 메세지와 데이터 메시지를 같이 혼용해서 사용한다
- 예를 들어 휴태폰 푸시 알림 메세지는 알림 메세지를 이용하고, 알림 메시지를 클릭하였을 때 앱내 특정 페이지로 이동이나, 어떠한 액션은 데이터 메세지를 통해서 이뤄진다.
메세지 종류 알림 가능 여부 알림 저장 개수 알림 처리 방법
| 알림 메시지 | 가능 | 여러 알림을 저장하나, OS 환경마다 다름 | 앱이 백그라운드일 경우 |
| 데이터 메시지 | 가능 | 1개의 알림만 저장 | 앱이 포그라운드일 경우 |
티켓팅
- 단일 기기, 기기 그룹, 주제를 구독한 기기 3가지 방식으로 클라이언트 앱에 메시지를 배포할 수 있다.
종류 대상 수 설명
| 단일 기기 | 1개 | 하나의 기기(앱 기준) |
| 기기 그룹 | 20개 | 알림 키에 허용되는 그룹 |
| 주제 구독 | 1000개 | 등록 토큰에 구독된 기기 |
클라이언트 앱에서 메시지 전송
- FCM을 이용하면 앱 서버에서 클라이언트 앱으로 다운 스트림 메시지를 보낼 수 있을 뿐만 아니라, 클라이언트 앱에서 앱 서버로도 업 스트림 메세지를 보낼 수 있다.
- 하지만 클라이언트 앱에서 앱 서버로 업스트림 메세지를 보내기 위해서는 선행 조건이 필요하다. 그 부분은 밑에서 설명한다.
FCM의 동작 원리
크게 송신자, FCM Backend Server, 수신자로 구분한다.

송신자
주로 앱 서버, HTTP 프로토콜을 사용하는 서버, 우리가 흔히 사용하는 iOS, Android 운영체제를 사용하는 모바일 기기가 될 수 있다.
FCM Backend Server
실질적으로 앱 서버에서 요청을 받아서 메세지를 처리하는 서버에 해당된다.
메시지를 수신할 클라이언트는 자신의 정보를 FCM Backend Server에 등록해야 한다
메세지를 전송할 주체(앱 서버)는 등록된 정보를 획득해야 하며, 해당 정보로 다운 스트림 메시지를 전송한다.
앱 서버에서 FCM Backend Server에 메세지 요청을 보내고, FCM Backend Server는 사용자 기기에서 실행되는 클라이언트 앱에 메세지를 보내게 된다.
📮개인 공부를 위한 공간으로 틀린 부분이 있을 수도 있습니다.📮
문제점 및 수정 사항이 있을 시, 언제든지 댓글로 피드백 주시기 바랍니다.
'TIL' 카테고리의 다른 글
| MSA (0) | 2023.07.03 |
|---|---|
| Redis ? (0) | 2023.05.26 |
| [GreenCherry/React, Spring boot, PWA, FCM] FCM을 활용한 백그라운드에서 알림 구현 (0) | 2023.05.25 |
| [JPA] OSIV와 성능 최적화 (0) | 2023.03.22 |
| [JPA] API 개발 고급 정리 (1) | 2023.03.21 |