BACKEND/JAVA & SPRING

푸시 알림은 어덯게 구현할까 ? FCM & SSE

이-프 2023. 12. 20. 13:24

프로젝트를 진행하면서, 거래완료정산완료 시, 푸시 알림을 구현해야했다. 푸시 알림을 어떻게 구현하면 좋을지 구글링해보다가, Real Time System에 대한 기초적인 공부와, 대표적인 기술인 FCM과 SSE에 대해 공부해보자. 🌱

Real Time System

“결과의 유효성이 얼마큼의 시간동안 유효한가” ⇒ deadline

  • 시간의 정밀성을 요구
  • Hard Real-Time System
    • deadline 이전에 반드시 결과값을 돌려줘야하는 시스템
    • deadline 이후에 결과값이 전달시, 유효하지 않는 결과값

    ex) 공장

  • Soft Real-Time System
    • deadline이 지나더라도 결과값의 유효성이 떨어지긴 하나, 무효 x
    • 시간의 경과에 따라 유효성이 줄어들고
    • 특정 임계점을 지나게 되면 완전히 무효

    ex) VOD service

⏰ 알림 기능

FCM

  • Firebase Cloud Messaging
  • 안정적으로 클라이언트 인스턴스에게 전송할 수 있는 교차 플랫폼 메시징 솔루션

동작과정

💡
FCM 작동 간략 설명

ServerFCMClient


  1. 클라이언트가 FCM 서버에서 유저별로 고유하게 발급되는 FCM 토큰을 발급받음
  1. 서버는 클라이언트로부터 해당 토큰을 전달받고 저장
  1. 특정 상황에 메시지에 토큰을 담아서 FCM 서버에 전송시, FCM이 해당 토큰의 유저에게 메시지를 전송

클라이언트가 fcm 서버에 등록되는 단계

  1. ClientFCM : FCM서버에서 유저별로 고유하게 발급되는 FCM 토큰 요청
  1. FCMClient : 요청한 토큰(키) 전달
  1. ClientServer : FCM 토큰 전달
  1. Server : FCM 토큰 DB에 저장

서버가 web에 데이터를 전달하는 과정

  1. DB에서 특정 클라이언트의 토큰 추출
  1. ServerFCM : 특정 토큰, 데이터를 HTTP를 이용하여 FCM에 전달
  1. FCMClient : 전달받은 토큰을 식별해서, 클라이언트에게 데이터 전달

장점

  • “교차 플랫폼 메시징 서비스” 이므로, 메시징을 클라이언트 플랫폼(Web, IOS, Android) 환경 별로 개발할 필요 x

    즉, 플랫폼 종속 없이 메시지 전송 구현 가능 ⇒ 복잡성 🔻

  • 기존 애플리케이션 서버 자체에 메시징 기능을 추가하는 것이 아니므로, 클라이언트가 애플리케이션 서버에 계속 접속해야하지 않아도 된다.
    • ServerClient : 네트워크 효율 🔻 & 디바이스 전략 사용 🔺
    • ServerFCMClient : Client는 FCM 서버에만 상주하면 되므로, 위의 단점 보완 가능

단점

  • SSE와 달리, 별도의 여러 설정 필요
  • SSE보다 느리기에 Soft Real-Time System 에 적합
  • FCM 서버에 의존하므로, FCM 서버 상태에 따라 지연 가능

🔗 참고 url


SSE

  • Server Send Events
  • Web Socket과 같이, Server와 Client간 데이터 송수신 기술

Short Polling

  • 클라이언트가 주기적으로 서버로 요청을 보내는 방법
  • 갱신되었는지 확인 → 갱신시, 데이터를 응답
  • Client & Server 모두 구현이 단순하다.
  • 실시간성이 중요하지 않다면 고려해볼 방법!

Long Polling

  • 서버와 한번 연결을 맺고 나면, 일정 시간 동안 서버에서 변경이 발생할 때마다 데이터를 전송받는 방법
  • 서버로부터 응답을 받고 나면, 다시 연결을 요청하므로 연결 요청 🔺

SSE

  • 서버와 한 번 연결을 맺고 나면, 일정 시간동안 서버에서 변경이 발생할 때마다 데이터를 전송받는 방법
출처 : https://tecoble.techcourse.co.kr/post/2022-10-11-server-sent-events/

동작과정

  1. ClientServer : SSE 연결 요청
  1. Server : 클라이언트와 매핑되는 SSE 통신 객체 만들기
  1. ServerClient : 서버 데이터 변경시, 해당 SSE 객체를 통해 데이터 전달

장점

  • HTTP를 제외한 다른 프로토콜을 사용하지 않아 가볍다
  • 서버에서 클라이언트로의 단방향 통신만 가능하므로, 클라이언트의 상호작용 없이 서버로부터 데이터가 전달되어야하는 상황에 적합

단점

  • payload의 크기가 제한적이여서 많은 데이터를 담을 수 없다.

🔗 참고 url


Uploaded by N2T