BackEnd

[Spring] FCM + 스프링 부트로 푸시 알림 구현 고민하기

kangminhyuk1111 2025. 1. 7. 15:43
반응형

푸시알림(Push Notification)이란?

푸시알림은 사용자의 스마트폰이나 컴퓨터에 실시간으로 전달되는 메시지나 알림을 말함

푸시 알림의 특성

1. 실시간성

  • 앱이나 웹사이트가 실행되고 있지 않아도 즉시 메시지가 전달됨
  • 서버에서 발생한 이벤트를 지연 없이 사용자에게 전달 가능

2. 양방향 통신

  • 서버에서 사용자 기기로 직접 메시지를 '푸시(밀어넣기)'할 수 있음
  • 전통적인 폴링(polling) 방식과 달리 효율적인 리소스 사용이 가능함

3. 다양한 용도

  • 커뮤니케이션: 새로운 메시지나 이메일 알림
  • 마케팅: 할인 정보나 프로모션 안내
  • 시스템: 앱 업데이트 알림
  • 안전: 날씨 경보나 긴급 상황 전파
  • 생산성: 일정 리마인더

4. 맞춤형 설정

  • 사용자가 원하는 종류의 알림만 선택적으로 받을 수 있음
  • 알림 시간대, 빈도 등을 개인화할 수 있음

푸시 알림을 구현하는 방법들

1. FCM (Firebase Cloud Messaging)

  • 안드로이드와 iOS를 모두 지원하는 푸시 알림 서비스임
  • 구글의 안정적인 인프라를 사용할 수 있으며, 크로스 플랫폼을 지원함
  • 하지만 구글이라는 서비스의 의존도가 매우 높음2. WebSocket
  • 실시간으로 양방향 통신을 지원함
  • 구현이 자유로우며, 양방향 통신을 할 수 있다는 이점이 있음
  • 서버 리소스 사용량이 높으며, 구현의 복잡도가 다소 높음3. SSE (Server-Sent-Event)
  • 서버에서 클라이언트로 단방향 통신을 구현할 수 있음
  • 구현이 간단하고 HTTP를 사용하기 때문에 익숙함(?)
  • 하지만 양방향 통신을 하지못하는 단점이 있음

크게 이 3가지 정도로 푸시알림을 구현한다고한다.

지금 내가 만들고 있는 프로젝트가 푸시알림이 필요한이유는 다음과 같다.

    1. 호스트와 신청자의 개념이 존재한다. 호스트가 등록한 글에 신청자가 신청을 하면, 호스트에게 신청을 했다는 푸시알림이 나가야한다.
    1. 그 반대도 마찬가지로 호스트가 신청자의 신청을 수락 및 거절 할 수 있다. 수락 및 거절을 하면 신청자에게 내용을 전송하고 푸시알림이 나가야된다.

결론적으로는 FCM을 사용하기로 결정했다.

  • SSE는 브라우저가 열려있을때만 알림을 받을 수 있다.
  • FCM은 닫혀있어도 가능하다는 이점이 있다.
  • SSE는 Long Polling 방식을 사용해서 서버 리소스의 손해가 발생한다.
  • Long Polling: 클라이언트 -> 서버의 연결 이후 리소스를 끊지 않고 계속 연결시키는 방식임, 간단하게 요청을 보내고 끊지 않고 응답이 올 때까지 기다리는 것.
  • SSE는 서버 불안정으로 혹시나 서버가 죽는다면 메세지가 유실될 가능성 존재
  • FCM은 별도의 구글 서버를 활용하기 때문에 전달을 보장하고 재시도 메커니즘을 제공함
  • 다양한 플랫폼과 브라우저를 지원하는 FCM이 합리적인 선택이라고 생각됨

FCM의 동작 방식

일단 동작방식을 한번 머릿속으로 생각해봤다.

  1. 서버에서 FCM 서버로 요청을 보낸다.
  2. FCM 서버에서 브라우저, 앱 등의 클라이언트로 요청을 보낸다.

하지만 이러한 경우 고안해야될 점이 많다.

서버에서 클라이언트로 요청을 보냈을때 클라이언트가 죽어있어서 요청을 받지 못할 경우
만약 죽어있지않더라도 다른 방식을 사용했을때는 서버 자원의 큰 손해로 이어진다.

내가 생각한 FCM을 통한 푸시알림 기능은 다음과 같다.

  1. 클라이언트에서 FCM에 등록을 요청
  2. FCM은 Token을 클라이언트에게 발급
  3. 클라이언트는 앱서버에 자신의 정보와 해당 토큰을 전달하고 서버는 이를 맵핑하여 저장.
  4. 맵핑된 정보를 토대로 앱서버는 푸시알림을 보내고 싶을때 클라이언트의 요청없이 FCM에 요청을 보냄
  5. FCM은 AppServer에서 받은 토큰으로 해당 클라이언트를 찾아 푸시알림을 보냄중요한 점클라이언트가 가진 앱 마다 FCM에서 받은 토큰은 모두 다르다는 것을 알자

이렇게 되면 서버 -> FCM서버 로 요청을 날리면 FCM 서버가 자동으로 원하는 Client의 기기로 라우팅을 해주게 된다.

그렇기 때문에 FCM서버가 클라이언트의 정보를 알 수 있도록 Token을 통한 정보 전달이 필요하게 되는 것이다.

반응형