
기존 방식의 한계
- 기존 요구사항 : 매 14, 19시에 물한잔 하라는 푸시알림 (전체 회원)
- 변경 요구사항 : 리마인드 알림을 킨 사람한테 매 1분마다 개별 알림
- 개인마다 리마인드 알림 받는 시간 지정 가능
- userA : 13시, 20시 15분
- userB : 15시, 18시 1분
1. notification DB 저장 시 saveAll 벌크 인서트 시 N번의 sql이 발생한다.
- JPA Identity 전략으로 인해 개별적 insert 쿼리 DB 전송
- DB는 각 insert 후 고유한 기본키 값을 생성하고 JPA에 반환
- JPA는 반환된 기본키 값을 각 Notification Entity에 설정
2. topic 기반 발송의 한계
- (기존) 회원가입하면 토픽 구독 시킴 & 모든 사용자에게 한번에 발송하는 구조
- (요구사항 변경) 알림설정한 사용자 & 유저마다 특정 시간마다 다름 등 개인화된 특정 알림을 보내기가 필요
개선 사안
1. JDBC Batch Insert
- 개별 insert 발생 하지 않고 여러 쿼리를 묶어서 한번에 발송하는 방식
- DB 접근 횟수가 획기적으로 줄고 성능 개선됨
2. FCM Multicast 적용
- topic 기반 발송 사용 불가
- token 기반이면 N번 반복해야 하는데 Multicast로 api 호출 횟수를 줄였다.
FCM MultiCast
FCM MultiCast란?
- 하나의 메세지를 여러 기기에 전송해야 하는 경우 한번에 전달할 수 있음
- FCM MultiCast Response로 어떤게 실패했는지에 대한 결과를 보내줌
Topic 방식의 한계
- 토픽 방식도 그룹에 발송할 수 있긴 한데 사용자가 구독을 하고 있어야하는 제약이 있음
- 사용자가 매 1분마다 알림을 받을 사용자가 계속 바뀌기 때문에 비효율적 & 관리 복잡
- 그래서 Token 기반 MultiCast를 도입함
- 14:00 -> A, B, C 사용자에게 발송
- 14:01 -> D, E 사용자에게 발송
- 14:02 -> A, F, G 사용자에게 발송
MultiCast 방식의 장점
- 구독 설정 없이 즉시 발송 가능
- 매번 다른 사용자 목록에 유연하게 대응 가능
구현 과정 및 트러블 슈팅
Token 기반 vs Topic 기반
| 항목 | Token 기반 (MultiCast) | Topic 기반 |
|---|
| 대상 | 특정 사용자 선택 가능 | 구독한 모든 사용자 |
| 유연성 | 높음 (개인화 가능) | 낮음 (일괄 발송만 가능) |
| 사용 사례 | 개인화된 알림, 특정 그룹 알림 | 공지사항, 전체 알림 |