SSA/Back
[SSA] 서버 FCM 기능 구현
하가네
2025. 5. 4. 19:52
간단하게 알림 서비스 기능에 대해서 정리해 봤습니다.
이것보다 더 자세한 내용은 각각을 찾아 보도록 하겠습니다.
기술 | 설명 | 장점 | 단점 | 사용 사례 |
폴링 (Polling) | 클라이언트가 일정 주기로 서버에 데이터 요청 | 구현이 간단 | 네트워크 트래픽 증가, 실시간성 떨어짐 | 간단한 상태 체크 |
롱 폴링 (Long Polling) | 요청이 도착할 때까지 서버가 응답을 대기 | 실시간성 향상 | 연결이 많아지면 서버 부하 증가 | Slack의 알림, 일부 AJAX 채팅 |
SSE (Server-Sent Events) | 서버가 클라이언트로 지속적인 단방향 메시지 전송 | 브라우저 지원, 단방향 푸시에 적합 | 양방향 통신 불가, 브라우저 한정 | 실시간 알림 |
WebSocket | 서버-클라이언트 간 양방향 통신 | 실시간성, 양방향 모두 지원 | 복잡한 인프라 구성 필요 | 채팅, 게임, 협업 앱 |
FCM (Firebase Cloud Messaging) | Google의 푸시 알림 서비스 (모바일/웹) | 모바일 친화적, 백그라운드 푸시 지원 | Firebase 종속, Android/iOS 외 사용 어려움 | 푸시 알림, 모바일 메시징 앱 |
SSA는 앱 사용을 우선적으로 가정하였기 때문에 FCM을 먼저 구현하고자 결정했습니다.
FCM에 대해 자세히 알아 보자면,
FCM 이란 ?
Firebase Cloud Messaging의 약자로 Android, iOS 및 웹 애플리케이션의 메시지 및 알림을 위한 크로스 플랫폼 클라우드 솔루션
FCM 작동 원리
- 서비스 서버가 Firebase 서버에 키 획득을 위한 요청을 보냄
- Firebase 서버에서 키를 만들어 클라이언트에 전달
- 클라이언트에 전달된 키를 서버에 전송
- 서비스 서버는 전달받은 키를 DB에 저장하여 타겟 모바일의 identification으로 사용
서버에서 데이터를 스마트폰에 전달하는 절차
- 서버에서 타겟 클라이언트에 데이터를 전달하기 위해 DB에서 키를 획득
- DB의 키와 전송하고자 하는 데이터를 HTTP 통신으로 Firebase 서버에 전달
- Firebase 서버에서는 전달받은 키 값을 식별해 어떤 클라이언트인지를 식별
- 식별된 클라이언트에 데이터 전달
FCM 의 장점
- FCM은 교차 플랫폼 메시지 솔루션이기 때문에 플랫폼에 종속되지 않고 Push 메시지를 전송할 수 있다.
- FCM에서 제공하는 여러 기능들도 함께 사용 가능하다.
- 기능 구축 시간과 비용이 줄어든다.
- 중간 클라우드 메시징 서버 덕에, 사용자는 낮은 배터리와 네트워크의 사용만으로도 메세지를 송수신 처리를 할 수 있다.
FCM 의 단점
- SSE에 비해서 별도의 설정이 추가로 필요하다.
- real-time 서비스이긴 하지만 장치 연결 상태, 메시지의 크기와 포맷, 네트워크 상태 등 전송 시간 지연 요소들이 존재한다.
- SSE의 실시간성에 비해서 느린 편이기 때문에 연성 실시간(soft real-time) 시스템에 적합하다.
정리하자면, Firebase 기반의 모바일 친화적인 알림 기술입니다.
현재는 수강 신청 기능과 신청 알림 기능이 모놀리틱 구조에서 구현되어 있습니다.
이 경우 발생할 수 있는 문제점은 다음과 같습니다.
구분 | 설명 |
결합도 증가 | 신청 기능과 알림 기능이 강하게 결합되어 기능 변경 시 영향 범위가 넓어짐 |
확장성 부족 | 알림 트래픽이 증가할수록 전체 서버의 리소스가 소모되어 신청 기능도 영향 받음 |
장애 전파 위험 | 알림 서비스가 실패하거나 장애가 발생하면 수강신청 처리도 함께 실패함 |
테스트 복잡성 | 두 기능이 강하게 연결되어 있어 단위 테스트 및 통합 테스트가 어려워짐 |
배포 리스크 | 알림 기능 수정 시 신청 기능도 함께 배포되어야 하는 상황 발생 가능 |
비동기 이벤트 처리 어려움 | 실시간 알림을 위해 이벤트 기반 구조로 확장하기 어려움 |
위와 같은 문제로
다음과 같이 서버를 분리하고자 합니다.
- 수강 신청 서버
- 신청 알림 서버
서버를 분리하면 얻을 수 있는 장점과 단점 해소는 다음과 같습니다.
- 서비스 간 결합도가 낮아지고 각각이 가지는 독립성이 증가하여 응집도가 높아질 수 있습니다.
- 각 기능의 수정이 다른 기능에 미치는 영향을 줄일 수 있습니다.
- 장애가 발생해도 다른 기능에까지 그 영향이 미치지 않도록 격리할 수 있습니다.
- 하나의 서버에 가해지는 트래픽이 분산되어 연산량을 줄일 수 있습니다.
당연히 이에 따른 단점도 존재합니다만, 학습용 목적으로 분리해 보겠습니다.
단점은 다음과 같습니다.
- 서버를 여러 개로 구현하게 되어 복잡한 인프라 구성이 필요할 수 있습니다.
- 내부 서버가 아니라 외부 서버 간 통신으로 인해 성능이 줄어들 수 있습니다.
추가 학습 후 작성 예정 ...