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을 사용해왔다면, 이번 기회에 데이터를 주고받는 방법이나 실시간 동기화 기능 등 더욱 다양한 방식으로 활용해보는 건 어떨까요? 😊
'백엔드 > Spring Boot' 카테고리의 다른 글
Java 애플리케이션 SIGSEGV (Segmentation Fault) 오류 해결하기 (1) | 2025.02.23 |
---|---|
Spring boot에 Swagger 적용하기 (0) | 2024.02.23 |
Spring 그리고 Spring Boot (1) | 2024.01.30 |
Spring boot Exception Handling (1) | 2024.01.17 |
Spring Validation(유효성 검사)에 대하여 알아보기 (0) | 2024.01.15 |