채팅 알림 및 기기별 알림 제어 [Google Design Docs]
1. 개요
본 문서는 기존의 폴링(Polling) 방식 채팅 시스템을 개선하고, 사용자의 실시간 상태 및 기기별/종류별 상세 설정에 따라 조건부로 FCM 푸시 알림을 발송하는 통합 시스템을 설계하는 것을 목표로 한다. 이 프로젝트를 통해 사용자에게는 끊김 없는 채팅 경험과 정제된 알림을 제공하고, 시스템적으로는 향후 확장성과 안정성을 확보하고자 한다.
2. 배경 및 동기
현재 시스템은 두 가지 주요한 문제점을 안고 있다.
첫 번째로 채팅 알림 시스템이 부재하여 중요한 메시지를 놓치기 쉬우며, 만약 구현하더라도 사용자의 현재 채팅방 접속 여부를 고려하지 않으면 무분별한 알림으로 인한 사용자 피로도를 증가시킬 수 있다.
또한, 사용자가 자신의 필요에 맞게 알림을 제어할 수 있는 기능(예: 기기별, 종류별 설정)이 없어 개인화된 경험을 제공하지 못하고 있다. 본 프로젝트는 이러한 문제들을 종합적으로 해결하기 위해 추진된다.
2.1. 목표 (Goals)
- 조건부 채팅 알림: 사용자가 특정 채팅방에 접속해 있지 않을 때만 새로운 메시지에 대한 FCM 푸시 알림을 표시한다.
- 기기별/종류별 알림 설정 기능 제공: 사용자가 각 디바이스(폰, 태블릿 등)마다 '채팅 알림', '운동 독려 알림' 등 종류별로 알림 수신 여부를 ON/OFF 할 수 있는 기능을 구현한다.
- 확장 가능한 알림 시스템 구축: 새로운 알림 유형이 추가될 때 DB 스키마 변경 없이 유연하게 확장 가능한 구조를 설계한다.
- 프리티어 환경 내 구현: 외부 유료 서비스나 별도의 서버 인스턴스 추가 없이, Redis 무료 티어(30MB)와 기존 인프라를 최대한 활용하여 시스템을 구축한다.
2.2. 비목표 (Non-Goals)
- 채팅 시스템을 완전한 실시간(WebSocket/STOMP) 방식으로 즉시 전환하는 것 (본 설계는 향후 전환을 용이하게 하는 기반을 마련하는 데 중점).
- '읽음' 확인(Read Receipts), '입력 중...'(Typing Indicator)과 같은 고급 실시간 채팅 기능을 구현하는 것.
- 파일, 이미지 등 미디어 전송 기능 구현.
3. 상세 설계 (솔루션 제안)
조건부 알림 기능을 구현하기 위해 두 가지 모델을 제안한다. 하나는 클라이언트가 상태를 판단하여 알림을 정제하는 모델이고, 다른 하나는 백엔드가 사용자의 실시간 상태를 관리하며 알림을 필터링하는 모델이다.
3.1. 클라이언트 기반 FCM 알림 필터링 모델