푸시 알림은 앱 또는 웹에서 사용자에게 메시지형태의 알림을 주는 것을 말한다.
기본적으로 HTTP프로토콜을 사용하는 클라이언트-서버 구조에선 클라이언트만 요청을 보낼 수 있고, 서버에서는 클라이언트의 요청을 받아야만 응답을 보내줄 수 있다.
그렇다면 서버가 먼저 메시지를 보내야하는 푸시 알림의 경우 어떻게 동작하게 할 수 있을까?
클라이언트의 요청없이 서버에서 먼저 메시지를 보내는 이러한 기법을 푸시 기법이라고 한다.
푸시 기법을 이용하는 순서는 다음과 같다.
FCM은 Firebase Cloud Messaging의 준말로, 메시지를 전송할 수 있게 도와주는 메시징 솔루션이다.
위에서 말한 푸시 서비스 중 하나라고 할 수 있다.
FCM은 FCM 토큰을 이용해 디바이스를 구별한다.
이 떄문에 먼저 앱을 FCM에 등록하는 것이 필요하다.
FCM 토큰의 경우, 다른 토큰들과 달리 기본 수명이나 갱신주기가 존재하지 않기 때문에 특정한 이벤트가 발생하기 전까지 만료되지 않는다.
토큰이 만료되는 이벤트는 다음과 같다.
위의 이벤트가 언제 실행될지는 모른다(특히 3,4 번), 그렇기 떄문에 토큰을 갱신하는 주기를 잘 설정해주는 것이 개발자가 해야하는 중요한 일이다.
만약 갱신을 잘못하여 만료된 토큰이 불러와질 경우, 핸들링하는 예외처리 기법도 마련해두어야 한다.
그 외 토큰에 대해 고려해야 할 경우 →
node js 서버에서 구현한 코드
import admin from 'firebase-admin';
import serviceAccount from '../service-account-file.json' assert {type : "json"};
admin.initializeApp({
credential: admin.credential.cert(serviceAccount)
});
export const requestFcm = async (token, title, message) => {
console.log(token);
const fcmToken = token;
const message = message;
const title = title;
const payload = {
notification: {
title: title,
body: message,
sound: 'default'
},
data: {
title: title,
body : message,
},
};
const options = {
priority: 'high',
timeToLive: 60 * 60 * 24
};
admin.messaging().sendToDevice(fcmToken, payload, options)
.then((response) => {
console.log('Successfully sent message:', response);
})
.catch((error) => {
console.log('Error sending message:', error);
});
};
위와 같이 함수를 export하여 다른 모듈에서 사용하도록 할 수 있다.
인자의 token은 devicetoken, title은 알림의 제목, message는 알림의 내용을 받아 사용한다.
serviceAccount는 firebase에서 프로젝트 설정 -> 서비스계정 -> 새 비공개 키 생성으로 파일을 발급받아 사용한다.