-
Notifications
You must be signed in to change notification settings - Fork 0
Description
알림 보내는 주체
처음 플루터에서 파이어베이스 토큰을 백엔드에서 전송하면 댓글이나 좋아요와 같이 정의한 알림에 따라 이벤트로 파이어베이스에게 알림 요청을 보냅니다.
즉, 플루터는 앱실행시 사용자 파이어베이스 토큰만 보내주시면 됩니다
Firebase Cloud Messaging SDK 사용
google-services.json (Android) 또는 GoogleService-Info.plist (iOS) 사용
북스타 지메일 계정으로 파이어베이스 들어가기
2. 파일 배치
Android 앱 추가 → google-services.json 다운로드
iOS 앱 추가 → GoogleService-Info.plist 다운로드
Android
android/app/google-services.json
iOS
ios/Runner/GoogleService-Info.plist
3. Flutter 패키지 설치
yamldependencies:
firebase_core: ^latest_version
firebase_messaging: ^latest_version
4. FCM 토큰 생성 및 백엔드 전송
dartimport 'package:firebase_messaging/firebase_messaging.dart';
Future initFCM() async {
// FCM 토큰 생성
String? token = await FirebaseMessaging.instance.getToken();
// 백엔드에 토큰 전송
await sendTokenToBackend(token);
}
권장 전략: Lazy Registration (지연 등록)
회원가입 시점이 아닌 앱 실행 시마다 FCM 토큰을 등록/갱신하는 방식이 좋습니다.
이유
- 토큰은 변경될 수 있음: 앱 재설치, 기기 변경, 토큰 만료 등
- 기존 가입자 문제 해결: 앱 실행 시 자동으로 토큰 등록
- 간단한 구현: 회원가입 플로우 복잡도 증가 없음
Flutter 구현
import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter/material.dart';class FCMService {
final FirebaseMessaging _firebaseMessaging = FirebaseMessaging.instance;// 앱 시작 시 호출
Future<void> initialize() async {
// 1. 알림 권한 요청
NotificationSettings settings = await _firebaseMessaging.requestPermission(
alert: true,
badge: true,
sound: true,
);if (settings.authorizationStatus == AuthorizationStatus.authorized) { // 2. FCM 토큰 가져오기 String? token = await _firebaseMessaging.getToken(); if (token != null) { // 3. 백엔드에 토큰 전송 await _sendTokenToBackend(token); } // 4. 토큰 갱신 리스너 등록 _firebaseMessaging.onTokenRefresh.listen((newToken) { _sendTokenToBackend(newToken); }); }}
Future<void> _sendTokenToBackend(String token) async {
// 로그인 상태 확인
final userId = await _getUserId(); // 로컬 저장소에서 userId 가져오기
if (userId == null) return; // 비로그인 상태면 무시try { // API 호출 // 스웨거 notification 참조 ); } catch (e) { print('Failed to send FCM token: $e'); }}
Future<int?> _getUserId() async {
// SharedPreferences, Hive 등에서 userId 가져오기
// 예시:
// final prefs = await SharedPreferences.getInstance();
// return prefs.getInt('userId');
}
}
main.dart에서 초기화
void main() async { WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp();runApp(MyApp());
}class MyApp extends StatefulWidget {
@override
State<MyApp> createState() => _MyAppState();
}class _MyAppState extends State<MyApp> {
final FCMService _fcmService = FCMService();@override
void initState() {
super.initState();
// 앱 시작 시 FCM 초기화
_fcmService.initialize();
}
@override
Widget build(BuildContext context) {
return MaterialApp(
// ...
);
}
}
백엔드 수정 (Upsert 방식)
@Transactional
public void save(FCMTokenCreateRequest request) {
// 기존 토큰이 있으면 업데이트, 없으면 생성
FCMToken fcmToken = fcmTokenRepository.findByUserId(request.getUserId())
.orElse(FCMToken.builder()
.userId(request.getUserId())
.build());
fcmToken.updateToken(request.getToken());
fcmTokenRepository.save(fcmToken);
}
타이밍 정리
시점
동작
앱 최초 실행
FCM 토큰 생성 → 백엔드 전송
앱 재실행
토큰 재확인 → 백엔드 전송 (변경 시에만)
로그인 시
토큰 전송
토큰 갱신 시
자동으로 백엔드 전송
기존 가입자 대응
✅ 별도 작업 불필요: 앱 업데이트 후 실행 시 자동으로 토큰 등록됨
이 방식이 가장 안정적이고 유지보수하기 좋습니다!