[Node.js] FCM HTTP v1 API로 변경

Sehee·2024년 9월 11일

이것저것 모음집

목록 보기
6/9
post-thumbnail

시작하며,

회사 서비스는 FCM으로 앱 푸시를 발송하는데, 9월 들어서고부터 앱 푸시가 아예 안 보내지는 듯 했다
본인은 프론트엔드 + 앱 개발자 포지션이어서, 지금까지 백엔드를 건드릴 일이 없었지만 이번에 백엔드 개발자 포지션이 공석이 되면서 스스로 고쳐야하는 상황이 발생했다


FCM

FCM이란

FCM은 Firebase Cloud Messaging의 약자로, 무료로 메시지를 전송할 수 있는 교차 플랫폼 메시징 솔루션이라고 한다

FCM을 이용하면 플랫폼에 종속되지 않고 푸시 메시지를 전송할 수 있다

iOS, Android, Web 각 플랫폼에서 푸시 메시지를 보내려면 각 플랫폼 환경별로 개발해야하는 불편함이 있는데, 이를 하나로 통합하는 솔루션이다

API 변경 안내

Firebase에서 올해 6월에 리마인드 메일이 하나 날라왔었다

기존에 지원하던 레거시 FCM API를 지원 중단하니, HTTP v1 API로 변경하라는 내용인 듯 하다
메일에는 6월 20일까지 이주를 마치라고 되어있는데, 8월에 보낸 앱 푸시가 잘 보내졌긴 해서 9월부터 중단되었으리라 추정하고만 있다


API 변경하기

HTTP v1 차이점

항목HTTP APIHTTP v1 API
서버 인증값Server Key (Legacy Key)OAuth 2.0 Access Token
메시지 객체 형식간단한 JSON 구조계층적이고 확장 가능한 JSON 구조
메시지 전송 함수sendToDevice, sendToTopic 등send, sendMulticast 등
멀티캐스트 메시지지원되지 않음지원됨
주제 전송sendToTopic 지원send에서 주제를 메시지에 포함 가능
조건 전송condition 필드 사용send에서 조건부 전송을 메시지에 포함 가능
지원되는 플랫폼Android, iOS, WebAndroid, iOS, Web, 추가 플랫폼별 설정 가능
배치 및 예약 전송지원되지 않음일부 플랫폼에서 예약 전송 지원
개발자 제어 옵션제한적확장된 설정 및 제어 기능 제공

HTTP v1으로 변경하기

기존에는 메시지를 보낼 때 호출하는 sendToDevice 함수에 서버 인증값과 메시지 객체를 담아 보냈다
메시지 객체에 서버 인증값(토큰)을 넣고, send 함수로 메시지 객체만 넘겨주면 해결이다

// 메시지 객체
let message = {
    token: user_token, // 토큰 추가
    data: { ... },
    notificatoin: { ... }
}
// HTTP API
result = await admin.messaging().sendToDevice(token, message);

// HTTP v1 API
result = await admin.messaging().send(message);

참고 사이트
[Project] 프로젝트 삽질기1 (feat FCM 공식문서)


마치며,

이번 이슈의 가장 큰 문제점은 앱 푸시 발송하는 쪽 코드가 너무 지저분하다는 것이었다
모듈화도 안 되어있어서 하나 수정하면 관련된 부분을 모두 찾아 하나씩 수정해줘야하는 형태로 되어있었고, 어떤 코드가 FCM과 관련된 코드인지 찾고 코드를 해석하는 데에 오랜 시간을 쏟았다

이번 일을 계기로 유지 보수 측면에서 클린 코드, 모듈화가 얼마나 중요한지 몸소 체험했다
프론트엔드 코드도 약간 지저분하게 짜둔 곳이 있는데, 앞으로 들어올 다른 개발자들을 위해서라도 리팩토링을 해야할 것 같다

profile
디자인하는 개발자

0개의 댓글