프로젝트를 진행하던 도중 푸쉬 알람 기능이 필요해서 FCM 사용법에 대해 공부해보려고 한다.
먼저 기본적인 흐름이다.
메시지 정보
FCM을 사용하기에 앞서 FCM에서 사용하는 메시지의 정보에 대해서 알아보자.
크게 메시지 유형은 알림 메시지와 데이터 메시지로 나뉜다.
알림 메시지는 사전 정의되어있는 key를 사용하며 포어그라운드에서 알림이 수신되면 코드에 따라 동작이 결정되고 백그라운드에서 알림이 수신되면 FCM SDK가 자동으로 메시지를 표시한다.
알림 메시지의 경우 Message 객체 안에 사전 정의 되어있는 key를 사용하면 된다.
<예시>
{
"message":{
"token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
"notification":{
"title":"Portugal vs. Denmark",
"body":"great match!"
}
}
}
데이터 메시지는 원하는 key-value 쌍을 정하여 사용하며 FCM SDK가 아닌 클라이언트 앱에서 메시지를 처리한다.
이는 Message 객체 안의 data 필드 안에 원하는 key - value 쌍을 정의하면 된다.
{
"message":{
"token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
"data":{
"Nick" : "Mario",
"body" : "great match!",
"Room" : "PortugalVSDenmark"
}
}
}
참고로 알림 메시지에도 필요하다면 data 키를 사용하여 원하는 key - value 쌍을 사용할 수 있다고 한다. (공식문서 참고)
플랫폼별 메시지
FCM의 경우 크게 보면 안드로이드, ios, 웹에서 사용할 수 있다.
Message 객체의 필드에도 플랫폼별 메시지를 정할 수가 있다.
우선 기본적으로 플랫폼에 관계없는 공통 필드와 특정 플랫폼에만 보내는 플랫폼별 필드가 존재한다.
공통 필드는 위에서 본 title, body, data 등이 있다.
모든 플랫폼에서 위 같은 공통 필드를 해석할 수 있는 반면 플랫폼별 필드를 사용하면 원하는 플랫폼에만 해당 필드를 보낼 수가 있다.
예를 들어 플랫폼마다 TTL을 다르게 설정하고 싶다면 플랫폼별 필드를 사용하면 된다.
<예시>
{
"message":{
"token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
"notification":{
"title":"Match update",
"body":"Arsenal goal in added time, score is now 3-0"
},
"android":{
"ttl":"86400s",
"notification"{
"click_action":"OPEN_ACTIVITY_1"
}
},
"apns": {
"headers": {
"apns-priority": "5",
},
"payload": {
"aps": {
"category": "NEW_MESSAGE_CATEGORY"
}
}
},
"webpush":{
"headers":{
"TTL":"86400"
}
}
}
}
비축소형과 축소형
메시지는 비축소형과 축소형으로 나뉜다.
비축소형은 콘텐츠가 기기로 전송되는 반면 축소형은 콘텐츠없이 전송된다.
비축소형은 모든 메시지를 전송하는데 만약 기기가 메시지를 받을 수 없는 상태라면 계속 메시지가 쌓이게 되고 한도를 넘어서게 되면 메시지가 삭제된다.
그에 반해 축소형은 가장 최신 메시지를 보내기 때문에 기기가 메시지를 받을 수 없는 상태에서 메시지가 쌓이지 않고 새 메시지를 대체된다.
채팅과 같은 서비스라면 비축소형을, 최신 소식만 알려주는 서비스라면 축소형을 사용하는 것이 좋다.
알림 메시지를 제외한 모든 메시지가 기본적으로 비축소형이다.
메시지 우선순위
메시지 우선순위는 보통 우선순위, 높은 우선순위가 존재한다.
보통 우선순위는 포그라운드일 때 메시지를 받으면 바로 받을 수 있고 백그라운드라면 시간이 걸릴 수 있다.
높은 우선순위는 FCM이 기기가 받기 어려운 상황에도 즉시 전송하려고 시도한다.
실시간성이 중요하다면 높은 우선순위를, 그렇지 않다면 보통 우선순위를 선택하면 된다.
참고로 Apple 기기로 데이터 메시지를 전송할 때 높은 우선순위를 설정하면 오류가 발생한다고 한다.
메시지 수명
최적의 상황에서는 전송된 메시지를 기기에서 즉시 받아볼 수 있겠지만 그렇지 못한 상황도 존재한다.
만약 기기가 메시지를 받을 수 없는 상태라면 받을 수 있을 때까지 메시지를 저장한다.
비축소형이라면 모든 메시지가 저장될테고 축소형이라면 최신 메시지가 갱신될 것이다.
토큰 관리
기기에서 토큰을 생성하고 서버로 보낸다면 이를 저장해두었다가 이 토큰을 통해 해당 기기로 메시지를 보낼 수가 있다.
그런데 서비스를 계속 운영하다보면 애플리케이션 삭제 등으로 인해 사용하지 않는 토큰이 존재할 수 있다.
이를 게속 보유하고 있다면 리소스가 낭비된다.
꾸준한 관리를 통해 사용하지 않는 토큰을 삭제하고 사용 중인 토큰을 유지해야한다.
공식 문서에서 권장하는 방식은 다음과 같다.
앱을 처음 시작할 때 토큰을 검색하여 타임스탬프와 함께 서버에 저장한다.
앱 제거, 재설치 등등과 같이 토큰이 변경될 때마다 타임스탬프를 업데이트한다.
또한 FCM에서 400, 404 같은 에러 메시지가 발생하면 잘못된 토큰을 타겟팅하고 있으므로 삭제하는 것이 안전하다.
그리고 사용하지 않는 토큰을 판단할 기준도 필요하다.
보통 2개월 정도 토큰이 지나면 사용하지 않는 토큰으로 판단하고 삭제하는 것이 좋다.
사용하는 토큰이라면 추가로 서버 로직을 작성하여 주기적으로 업데이트를 하는 것이 좋다.
FCM에서 사용하는 기본적인 내용들을 알아보았다.
다음 포스팅에서는 간단한 안드로이드 어플리케이션을 만들어서 FCM으로 메시지를 전송해보려고 한다.
참고
https://firebase.google.com/docs/cloud-messaging?hl=ko
'공부 > Spring' 카테고리의 다른 글
[Spring/Kotlin] Java와 Kotlin의 의존성 주입 방법 비교 (0) | 2024.04.04 |
---|---|
[WebRTC] WebRTC, KMS, OpenVidu 개념 (0) | 2023.10.24 |
[Spring] LocalDate, LocalDateTime의 serializer와 deserializer 커스텀하기 (Json과 LocalDate 혹은 LocalDateTime 변환) (0) | 2023.08.07 |
[Spring] 스프링 부트 Redis를 사용하여 refresh token 저장하기 (2) - docker-compose 사용법 (0) | 2023.07.17 |
[Spring][Redis] 스프링 부트 RedisRepository 사용법 (0) | 2023.07.15 |
댓글