푸시알림(Push Notification)이란?
푸시알림은 사용자의 스마트폰이나 컴퓨터에 실시간으로 전달되는 메시지나 알림을 말함
푸시 알림의 특성
1. 실시간성
- 앱이나 웹사이트가 실행되고 있지 않아도 즉시 메시지가 전달됨
- 서버에서 발생한 이벤트를 지연 없이 사용자에게 전달 가능
2. 양방향 통신
- 서버에서 사용자 기기로 직접 메시지를 '푸시(밀어넣기)'할 수 있음
- 전통적인 폴링(polling) 방식과 달리 효율적인 리소스 사용이 가능함
3. 다양한 용도
- 커뮤니케이션: 새로운 메시지나 이메일 알림
- 마케팅: 할인 정보나 프로모션 안내
- 시스템: 앱 업데이트 알림
- 안전: 날씨 경보나 긴급 상황 전파
- 생산성: 일정 리마인더
4. 맞춤형 설정
- 사용자가 원하는 종류의 알림만 선택적으로 받을 수 있음
- 알림 시간대, 빈도 등을 개인화할 수 있음
푸시 알림을 구현하는 방법들
1. FCM (Firebase Cloud Messaging)
- 안드로이드와 iOS를 모두 지원하는 푸시 알림 서비스임
- 구글의 안정적인 인프라를 사용할 수 있으며, 크로스 플랫폼을 지원함
- 하지만 구글이라는 서비스의 의존도가 매우 높음2. WebSocket
- 실시간으로 양방향 통신을 지원함
- 구현이 자유로우며, 양방향 통신을 할 수 있다는 이점이 있음
- 서버 리소스 사용량이 높으며, 구현의 복잡도가 다소 높음3. SSE (Server-Sent-Event)
- 서버에서 클라이언트로 단방향 통신을 구현할 수 있음
- 구현이 간단하고 HTTP를 사용하기 때문에 익숙함(?)
- 하지만 양방향 통신을 하지못하는 단점이 있음
크게 이 3가지 정도로 푸시알림을 구현한다고한다.
지금 내가 만들고 있는 프로젝트가 푸시알림이 필요한이유는 다음과 같다.
-
- 호스트와 신청자의 개념이 존재한다. 호스트가 등록한 글에 신청자가 신청을 하면, 호스트에게 신청을 했다는 푸시알림이 나가야한다.
-
- 그 반대도 마찬가지로 호스트가 신청자의 신청을 수락 및 거절 할 수 있다. 수락 및 거절을 하면 신청자에게 내용을 전송하고 푸시알림이 나가야된다.
결론적으로는 FCM을 사용하기로 결정했다.
- SSE는 브라우저가 열려있을때만 알림을 받을 수 있다.
- FCM은 닫혀있어도 가능하다는 이점이 있다.
- SSE는 Long Polling 방식을 사용해서 서버 리소스의 손해가 발생한다.
- Long Polling: 클라이언트 -> 서버의 연결 이후 리소스를 끊지 않고 계속 연결시키는 방식임, 간단하게 요청을 보내고 끊지 않고 응답이 올 때까지 기다리는 것.
- SSE는 서버 불안정으로 혹시나 서버가 죽는다면 메세지가 유실될 가능성 존재
- FCM은 별도의 구글 서버를 활용하기 때문에 전달을 보장하고 재시도 메커니즘을 제공함
- 다양한 플랫폼과 브라우저를 지원하는 FCM이 합리적인 선택이라고 생각됨
FCM의 동작 방식
일단 동작방식을 한번 머릿속으로 생각해봤다.
- 서버에서 FCM 서버로 요청을 보낸다.
- FCM 서버에서 브라우저, 앱 등의 클라이언트로 요청을 보낸다.
하지만 이러한 경우 고안해야될 점이 많다.
서버에서 클라이언트로 요청을 보냈을때 클라이언트가 죽어있어서 요청을 받지 못할 경우
만약 죽어있지않더라도 다른 방식을 사용했을때는 서버 자원의 큰 손해로 이어진다.
내가 생각한 FCM을 통한 푸시알림 기능은 다음과 같다.
- 클라이언트에서 FCM에 등록을 요청
- FCM은 Token을 클라이언트에게 발급
- 클라이언트는 앱서버에 자신의 정보와 해당 토큰을 전달하고 서버는 이를 맵핑하여 저장.
- 맵핑된 정보를 토대로 앱서버는 푸시알림을 보내고 싶을때 클라이언트의 요청없이 FCM에 요청을 보냄
- FCM은 AppServer에서 받은 토큰으로 해당 클라이언트를 찾아 푸시알림을 보냄중요한 점클라이언트가 가진 앱 마다 FCM에서 받은 토큰은 모두 다르다는 것을 알자
이렇게 되면 서버 -> FCM서버 로 요청을 날리면 FCM 서버가 자동으로 원하는 Client의 기기로 라우팅을 해주게 된다.
그렇기 때문에 FCM서버가 클라이언트의 정보를 알 수 있도록 Token을 통한 정보 전달이 필요하게 되는 것이다.
반응형
'BackEnd' 카테고리의 다른 글
FCM(Firebase Cloud Messaging)을 Spring boot에서 테스트 하기 좋은 코드로 만들어보기 (0) | 2025.01.13 |
---|---|
[Spring] Filter에서 Exception을 관리하는 법 (0) | 2024.12.19 |
[Spring] @RestControllerAdvice를 통한 스프링에서의 예외처리 (1) | 2024.12.16 |
[DB] 효율적인 설계를 위해 어떤 SQL을 사용해야 할까? RDBMS vs NoSQL과 DB에서의 수직 확장(scale-up)과 수평 확장(scale-out) (0) | 2024.06.20 |
[Spring] 스프링이 사랑한 디자인 패턴 - 1 (0) | 2024.05.29 |