Spring boot API 프로젝트에 FCM 적용하기

2025. 2. 15. 16:14백엔드/Spring Boot

대부분의 프로젝트에서 푸시 알림 기능은 필수 요소로 자리잡고 있으며, 많은 개발자들이 이를 구현하는 경험을 갖게 됩니다. 특히 모바일 앱이나 웹 애플리케이션에서는 Firebase Cloud Messaging(FCM)을 활용해 사용자에게 실시간으로 메시지를 이용하여 정보를 전달하는 것이 보편적입니다.

이번 글에서는 Spring Boot API 프로젝트에 FCM Admin SDK 을 적용해 푸시 알림 기능을 구현하는 과정을 자세히 알아보도록 하겠습니다.

 

API를 적용하는 가장 첫번째 방법은 바로 문서 확인이죠?! 문서를 먼저 확인해보고 옵시다!!

 

앱 서버 전송 요청 작성  |  Firebase Cloud Messaging

4월 9~11일, Cloud Next에서 Firebase가 돌아옵니다. 지금 등록하기 의견 보내기 앱 서버 전송 요청 작성 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. Firebase Admin

firebase.google.com

 


 

✉️ FCM (Firebase Cloud Messaging)

FCM은 Google에서 제공하는 무료 클라우드 메시징 서비스로, 모바일 및 웹 애플리케이션에 푸시 알림을 전송하는 데 사용됩니다. 이를 통해 개발자는 사용자에게 실시간으로 알림을 보내거나, 백그라운드에서 데이터를 전달하여 앱 내 특정 동작을 수행할 수 있습니다.

FCM을 이용하면 효율적인 메시징 시스템을 구축할 수 있습니다. 

 

FCM 이점 

1. 다양한 플랫폼을 무료로 지원 

  • Android, iOS, 웹 등 다양한 플랫폼을 무료로 지원
  • 동일한 API를 통해 여러 플랫폼에 푸시 알림을 보낼 수 있으며 플랫폼에 구애받지 않고 유연하게 푸시 메시지 개발/관리 가능 

 

2. 쉽고 간편한 설정

  • FCM은 설정이 간편하고, Firebase 콘솔을 통해 쉽게 메시지를 보내거나, API를 통해 서버와 연동 가능 
  • 별도의 메시징 서버 인프라 없이 빠르게 푸시 알림 기능 개발 가능 

3. 보안&안정성

  • 메시지를 전송하는 과정에서 TLS 암호화를 지원하여 사용자의 데이터를 안전하게 보호 
  • FCM은 Google의 글로벌 인프라를 기반으로 구축되어 있으며, 이를 통해 높은 신뢰성과 안정성을 제공
  • 대규모의 트래픽을 처리와 푸시 메시지 전송의 지연을 최소화 하여 안정적인 서비스 운영 가능 

 

FCM 메시지 타입 

타입 설명 용도
알림 메시지
(Notification Message)
UI에 표시되는 알림 메시지, 백그라운드 에서 자동으로 알림을 표시 중요한 알림을 전송할 때 사용
데이터 메시지
(Data Message)
UI 에 미노출, 앱 내부에서 특정 동작을 수행 앱 내 비즈니스 로직 처리, 실시간 데이터 동기화 등
혼합 메시지
(Notification + Data Message)
알림 메시지와 데이터 메시지를 결합하여 전송 알림을 보이면서도 데이터를 동기화하거나 처리할 때 사용 / 주로 혼합 형식을 이용 

 

FCM 타겟팅 방식 

타입 설명 용도
개별 디바이스
(Single Device)
특정 디바이스 토큰을 사용, 단일 사용자에게 메시지를 전송 특정 사용자에게만 메시지 전송
주제(Topic) 기반 메시징
(Topic Messaging)
여러 사용자가 구독한 주제/채널에 메시지를 전송 관심사 기반으로 사용자들에게 동일한 메시지 전송
기기 그룹
(Device Group) 메시징
사용자의 여러 기기(스마트폰, 태블릿 등)에 동일한 메시지를 전송 하나의 사용자가 여러 기기에서 알림을 받을 때 유용
조건부 메시징
(Conditional Messaging)
조건을 만족하는 사용자에게만 메시지를 전송 (Ex. 국가) 특정 조건을 만족하는 사용자에게 맞춤형 메시지 전송

 

 

🔥 FCM Admin SDK 적용하기

1. 의존성 추가 

🐘 Gradle

dependencies {
    implementation("com.google.firebase:firebase-admin:9.2.0")
}

 

🪶 Maven

<dependencies>
    <dependency>
        <groupId>com.google.firebase</groupId>
        <artifactId>firebase-admin</artifactId>
        <version>9.2.0</version>
    </dependency>
</dependencies>

 

2. Firebase 프로젝트 설정

1. firebase 콘솔에서 프로젝트 생성

2. 프로젝트 설정 → 서비스 계정 → Firebase Admin SDK로 이동

3. 새 비공개 키 생성 버튼을 클릭, serviceAccountKey.json 파일을 다운로드

 

3. Firebase Config 클래스 생성 

Spring Boot에서 FCM을 사용하려면 Firebase를 초기화해야 합니다.

import com.google.auth.oauth2.GoogleCredentials;
import com.google.firebase.FirebaseApp;
import com.google.firebase.FirebaseOptions;
import jakarta.annotation.PostConstruct;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Service;

import java.io.IOException;
import java.io.InputStream;

@Service
public class FirebaseConfig {

    @PostConstruct
    public void initialize() throws IOException {
        InputStream serviceAccount = new ClassPathResource("serviceAccountKey.json").getInputStream();

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

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

 

 

4. 푸시 알림 전송 로직 구현

FCM 토큰은 사용자 디바이스에서 발급 받아야 하며, 클라이언트에서 Firebase SDK를 적용해야 합니다. 

import com.google.firebase.messaging.FirebaseMessaging;
import com.google.firebase.messaging.Message;
import com.google.firebase.messaging.Notification;
import org.springframework.stereotype.Service;

@Service
public class FcmService {

    public void sendNotification(String targetToken, String title, String body) {
        Message message = Message.builder()
                .setToken(targetToken)
                .setNotification(Notification.builder()
                        .setTitle(title)
                        .setBody(body)
                        .build())
                .build();

        try {
            String response = FirebaseMessaging.getInstance().send(message);
            System.out.println("Successfully sent message: " + response);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

 

5. 테스트 

테스트 가능한 컨트롤러, 서비스 클래스를 만든 후 각자의 방식으로 테스트 진행

 

 

FCM은 단순히 사용자에게 메시지를 보여주는 용도뿐만 아니라, UI에 표시되지 않는 데이터 전송이나 실시간 동기화 등 다양한 방식으로 활용할 수 있습니다. 예를 들어, 데이터 메시지를 이용해 앱 내부에서 특정 동작을 수행하거나, 실시간 동기화를 통해 채팅 애플리케이션에서 메시지를 즉시 반영하는 것도 가능합니다.

푸시 알림을 보내는 용도로만 FCM을 사용해왔다면, 이번 기회에 데이터를 주고받는 방법이나 실시간 동기화 기능 등 더욱 다양한 방식으로 활용해보는 건 어떨까요? 😊