
회사 서비스는 FCM으로 앱 푸시를 발송하는데, 9월 들어서고부터 앱 푸시가 아예 안 보내지는 듯 했다
본인은 프론트엔드 + 앱 개발자 포지션이어서, 지금까지 백엔드를 건드릴 일이 없었지만 이번에 백엔드 개발자 포지션이 공석이 되면서 스스로 고쳐야하는 상황이 발생했다
FCM은 Firebase Cloud Messaging의 약자로, 무료로 메시지를 전송할 수 있는 교차 플랫폼 메시징 솔루션이라고 한다
FCM을 이용하면 플랫폼에 종속되지 않고 푸시 메시지를 전송할 수 있다
iOS, Android, Web 각 플랫폼에서 푸시 메시지를 보내려면 각 플랫폼 환경별로 개발해야하는 불편함이 있는데, 이를 하나로 통합하는 솔루션이다
Firebase에서 올해 6월에 리마인드 메일이 하나 날라왔었다
기존에 지원하던 레거시 FCM API를 지원 중단하니, HTTP v1 API로 변경하라는 내용인 듯 하다
메일에는 6월 20일까지 이주를 마치라고 되어있는데, 8월에 보낸 앱 푸시가 잘 보내졌긴 해서 9월부터 중단되었으리라 추정하고만 있다

| 항목 | HTTP API | HTTP v1 API |
|---|---|---|
| 서버 인증값 | Server Key (Legacy Key) | OAuth 2.0 Access Token |
| 메시지 객체 형식 | 간단한 JSON 구조 | 계층적이고 확장 가능한 JSON 구조 |
| 메시지 전송 함수 | sendToDevice, sendToTopic 등 | send, sendMulticast 등 |
| 멀티캐스트 메시지 | 지원되지 않음 | 지원됨 |
| 주제 전송 | sendToTopic 지원 | send에서 주제를 메시지에 포함 가능 |
| 조건 전송 | condition 필드 사용 | send에서 조건부 전송을 메시지에 포함 가능 |
| 지원되는 플랫폼 | Android, iOS, Web | Android, iOS, Web, 추가 플랫폼별 설정 가능 |
| 배치 및 예약 전송 | 지원되지 않음 | 일부 플랫폼에서 예약 전송 지원 |
| 개발자 제어 옵션 | 제한적 | 확장된 설정 및 제어 기능 제공 |
기존에는 메시지를 보낼 때 호출하는 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);
이번 이슈의 가장 큰 문제점은 앱 푸시 발송하는 쪽 코드가 너무 지저분하다는 것이었다
모듈화도 안 되어있어서 하나 수정하면 관련된 부분을 모두 찾아 하나씩 수정해줘야하는 형태로 되어있었고, 어떤 코드가 FCM과 관련된 코드인지 찾고 코드를 해석하는 데에 오랜 시간을 쏟았다
이번 일을 계기로 유지 보수 측면에서 클린 코드, 모듈화가 얼마나 중요한지 몸소 체험했다
프론트엔드 코드도 약간 지저분하게 짜둔 곳이 있는데, 앞으로 들어올 다른 개발자들을 위해서라도 리팩토링을 해야할 것 같다