[영상후기] FCM 대량 알림 최적화 | 칼리

박철현·2026년 6월 14일

영상후기

목록 보기
162/162

movie

기존 방식의 한계

  • 기존 요구사항 : 매 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 기반 발송의 한계

  • (기존) 회원가입하면 토픽 구독 시킴 & 모든 사용자에게 한번에 발송하는 구조
  • (요구사항 변경) 알림설정한 사용자 & 유저마다 특정 시간마다 다름 등 개인화된 특정 알림을 보내기가 필요
    • topic 기반 발송 사용할 수 없게됨

개선 사안

1. JDBC Batch Insert

  • 개별 insert 발생 하지 않고 여러 쿼리를 묶어서 한번에 발송하는 방식
  • DB 접근 횟수가 획기적으로 줄고 성능 개선됨

2. FCM Multicast 적용

  • topic 기반 발송 사용 불가
  • token 기반이면 N번 반복해야 하는데 Multicast로 api 호출 횟수를 줄였다.

FCM MultiCast

FCM MultiCast란?

  • 하나의 메세지를 여러 기기에 전송해야 하는 경우 한번에 전달할 수 있음
    • 최대 500개 기기 까지
  • FCM MultiCast Response로 어떤게 실패했는지에 대한 결과를 보내줌

Topic 방식의 한계

  • 토픽 방식도 그룹에 발송할 수 있긴 한데 사용자가 구독을 하고 있어야하는 제약이 있음
    • 사용자가 매 1분마다 알림을 받을 사용자가 계속 바뀌기 때문에 비효율적 & 관리 복잡
    • 그래서 Token 기반 MultiCast를 도입함
- 14:00 -> A, B, C 사용자에게 발송
- 14:01 -> D, E 사용자에게 발송
- 14:02 -> A, F, G 사용자에게 발송

MultiCast 방식의 장점

  • 구독 설정 없이 즉시 발송 가능
  • 매번 다른 사용자 목록에 유연하게 대응 가능

구현 과정 및 트러블 슈팅

  • 공식 문서에서 sendMultiCast 메서드를 찾아서 사용함

    • Exception에서 명확한 오류가 안뜨고 Null이 반환됨
    • 이 메서드가 지원 종료됨!
  • sendEachForMulticast 메서드를 사용해야한다!

Token 기반 vs Topic 기반

항목Token 기반 (MultiCast)Topic 기반
대상특정 사용자 선택 가능구독한 모든 사용자
유연성높음 (개인화 가능)낮음 (일괄 발송만 가능)
사용 사례개인화된 알림, 특정 그룹 알림공지사항, 전체 알림
profile
비슷한 어려움을 겪는 누군가에게 도움이 되길

0개의 댓글