[SpringBoot] FCM 알림 전송하기

다은·2025년 9월 21일

SpringBoot

목록 보기
12/14

앱 서비스를 만들다보면 점점 필수가 되어가는 알림 기능 ..
FCM 연결해봅시다


1. 로직

구상 중인 FCM 알림 전송 로직은 다음과 같습니다.
알림 소실을 최소화하기 위해 RabbitMQ를 도입하고, 이벤트 발행 로직도 eventListener을 이용해 비동기로 처리할 계획입니다.

  1. [클라이언트] 앱 접속 및 가입
  2. [클라이언트 → Firebase] FCM 토큰 발급 요청
  3. [Firebase → 클라이언트] FCM 토큰 발급
  4. [클라이언트 → 서버] FCM 토큰 전달
  5. [서버] FCM 토큰 저장
  6. [서버] 이벤트 발생
  7. [서버 → RabbitMQ] 알림에 필요한 정보 발행
  8. [RabbitMQ → 서버] Consumer가 큐를 구독하다가 메시지 가져와 처리
  9. [서버] DB에서 FCM 토큰 조회
  10. [서버 → FCM] FCM 토큰, 메시지를 FCM 서버에 전송
  11. [FCM → 클라이언트] 알림 전송



2. Firebase 설정

1. Firebase SDK

FCM 연결을 위한 Firebase 설정을 해봅시다.

  1. 파이어베이스 콘솔로 이동
  2. 프로젝트 생성
  3. 프로젝트 → 프로젝트 설정 → 서비스 계정
  4. 새 비공개 키 생성해 Json 파일 획득

2. FirebaseConfig

  1. 의존성 추가
implementation("com.google.firebase:firebase-admin:9.2.0")
  1. 위에서 다운로드한 키 파일 인식
    • resource/에 다운로드한 비공개 키 위치
    • application.yml에 키 이름 명시
fcm:
  credentials:
    path: classpath:${FIREBASE_KEY}
  1. config 파일 작성
@Configuration
class FirebaseConfig(
    @Value("\${fcm.credentials.path}") private val accountKey: Resource
) {

    @PostConstruct
    fun initialize() {
        try {
            val serviceAccount = accountKey.inputStream

            val options = FirebaseOptions.builder()
                .setCredentials(GoogleCredentials.fromStream(serviceAccount))
                .build()

            if (FirebaseApp.getApps().isEmpty()) {
                FirebaseApp.initializeApp(options)
            }

        } catch (e: Exception) {
            e.printStackTrace()
            throw GeneralException(ErrorStatus.INITIAL_FIREBASE_INTERNAL_SERVER_ERROR)
        }
    }

}



3. FCM Token 관리

1. FCM Token

앞서 계속해서 언급한 FCM Token이란, 사용자의 기기를 구분하기 위한 토큰입니다. 알림을 어떤 기기로 발송할지 구분하기 위해 필요한 정보죠.


2. FCM Token 등록, 삭제

이 FCM Token을 어떻게 관리해야 할까요

우선 User Entity에 FCM Token을 저장할 필드를 생성했습니다.

서비스의 확장성을 고려한다면 Token 테이블을 생성해서 1:N으로 관계를 맺을 수도 있으나, 품이 작은 관계로, 1:1 관계로 간주하고 user에 필드를 생성하는 방향으로 구현했습니다.

@Column
var fcmToken: String? = fcmToken

토큰 등록의 경우, 회원가입 시, 클라이언트로부터 FCM Token을 전달받아 entity에 함께 저장할 수 있겠습니다.

또한 로그아웃 및 회원탈퇴 시 해당 기기에 알림이 전송되면 안되므로, FCM Token을 삭제해야겠지요.



이번 포스팅에서는 우선적으로 FCM 연결을 위한 기본 세팅을 진행했습니다.
다음 포스팅부터는 FCM 전송로직, RabbitMQ 연결 등의 내용을 다루어보겠습니다.

profile
CS 마스터를 향해 ..

0개의 댓글