FCM을 이용한 푸시 알림 서버 구현하기 (with node.js)

POII·2022년 10월 13일
0

FCM을 이용한 푸시알림

개요

푸시 알림은 앱 또는 웹에서 사용자에게 메시지형태의 알림을 주는 것을 말한다.

기본적으로 HTTP프로토콜을 사용하는 클라이언트-서버 구조에선 클라이언트만 요청을 보낼 수 있고, 서버에서는 클라이언트의 요청을 받아야만 응답을 보내줄 수 있다.

그렇다면 서버가 먼저 메시지를 보내야하는 푸시 알림의 경우 어떻게 동작하게 할 수 있을까?

푸시서버의 원리

클라이언트의 요청없이 서버에서 먼저 메시지를 보내는 이러한 기법을 푸시 기법이라고 한다.

푸시 기법을 이용하는 순서는 다음과 같다.

  1. 먼저 앱 또는 웹 형태의 클라이언트에서 device token 을 발급받는다.
  2. 클라이언트는 발급받은 device token을 포함한 해당 유저 정보를 서버에 보내준다
  3. 서버는 받아온 데이터를 저장하고, 푸시 서비스(이 글에서 푸시 서비스는 fcm 으로 예를 들겠다.)에서도 기기의 토큰 정보를 저장한다.
  4. 서버에서 메시지를 보내야하는 특정 이벤트가 발생했을때, 메시지를 보내고자 하는 보낼 유저 정보를 필터링하여, 이 정보를 푸시 서비스(FCM)에 전송해준다.
  5. FCM 은 정보를 기준으로 어떤 device token을 이용해 메시지를 전송할 지 판단하고 메시지를 전송한다.

FCM

FCM은 Firebase Cloud Messaging의 준말로, 메시지를 전송할 수 있게 도와주는 메시징 솔루션이다.

위에서 말한 푸시 서비스 중 하나라고 할 수 있다.

FCM은 FCM 토큰을 이용해 디바이스를 구별한다.

이 떄문에 먼저 앱을 FCM에 등록하는 것이 필요하다.

FCM 토큰의 경우, 다른 토큰들과 달리 기본 수명이나 갱신주기가 존재하지 않기 때문에 특정한 이벤트가 발생하기 전까지 만료되지 않는다.

토큰이 만료되는 이벤트는 다음과 같다.

  • 인스턴스 ID를 앱에서 삭제한 경우
  • 새 기기에서 앱이 복원되었을 경우
  • 사용자가 앱을 제거 / 재설치 했을 경우
  • 사용자가 앱 데이터를 삭제했을 경우

위의 이벤트가 언제 실행될지는 모른다(특히 3,4 번), 그렇기 떄문에 토큰을 갱신하는 주기를 잘 설정해주는 것이 개발자가 해야하는 중요한 일이다.

만약 갱신을 잘못하여 만료된 토큰이 불러와질 경우, 핸들링하는 예외처리 기법도 마련해두어야 한다.

그 외 토큰에 대해 고려해야 할 경우 →

  • 같은 기기에서 여러개의 아이디를 쓰는 경우
  • 같은 아이디로 여러개의 기기를 이용하는 경우 (db를 설계할 때 하나의 유저가 여러개의 토큰을 보유 할 수 있게하면 해결 할 수 있을 것 같다)
  • 오래된 토큰이 존재하여 사용하지 않는 기기에 메시지를 지속적으로 보내는 경우

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에서 프로젝트 설정 -> 서비스계정 -> 새 비공개 키 생성으로 파일을 발급받아 사용한다.

profile
https://github.com/poi1649/learning

0개의 댓글