๋ณธ๋ฌธ์œผ๋กœ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๋ฐ˜์‘ํ˜•

React Native(Expo) ์•ฑ์—์„œ ํ‘ธ์‹œ ์•Œ๋ฆผ์„ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด
Firebase Cloud Messaging(FCM) ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์•ˆ์ •์ ์ธ ๊ตฌ์กฐ๋‹ค.
์—ฌ๊ธฐ์„œ๋Š” ExpoPushToken์ด ์•„๋‹Œ FCM Token ๊ธฐ๋ฐ˜์œผ๋กœ ํ‘ธ์‹œ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์ „์ฒด ํ๋ฆ„์„ ์ •๋ฆฌํ•œ๋‹ค.


1. Firebase ๊ธฐ๋ณธ ์„ค์ •

1) Firebase ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ

https://firebase.google.com/

 

Firebase | Google's Mobile and Web App Development Platform

๊ฐœ๋ฐœ์ž๊ฐ€ ์‚ฌ์šฉ์ž๊ฐ€ ์ข‹์•„ํ•  ๋งŒํ•œ ์•ฑ๊ณผ ๊ฒŒ์ž„์„ ๋นŒ๋“œํ•˜๋„๋ก ์ง€์›ํ•˜๋Š” Google์˜ ๋ชจ๋ฐ”์ผ ๋ฐ ์›น ์•ฑ ๊ฐœ๋ฐœ ํ”Œ๋žซํผ์ธ Firebase์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์„ธ์š”.

firebase.google.com

Firebase Console → ์ƒˆ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ

ํ•„์š”ํ•œ ๊ธฐ๋Šฅ:

  • Cloud Messaging
  • Firebase Admin SDK (๋ฐฑ์—”๋“œ)

2) Android ์„ค์ •

Android ์•ฑ ์ถ”๊ฐ€ → ํŒจํ‚ค์ง€๋ช… ์ž…๋ ฅ
๊ฒฝ๋กœ ์˜ˆ์‹œ:

com.appname.app

์ดํ›„ ์ œ๊ณต๋˜๋Š” ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œ:

google-services.json

Expo(EAS)์—์„œ๋Š” ๋‹ค์Œ์ฒ˜๋Ÿผ app.json ๋˜๋Š” app.config.js์— ๋“ฑ๋กํ•ด์ค€๋‹ค:

{
  "expo": {
    "android": {
      "googleServicesFile": "./google-services.json"
    }
  }
}

2. FCM Token ๊ฐ€์ ธ์˜ค๊ธฐ (Expo ์•ฑ)

Expo Go์—์„œ๋Š” FCM Token์ด ์ƒ์„ฑ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—
๋ฐ˜๋“œ์‹œ EAS Build๋กœ ๋งŒ๋“  ๋…๋ฆฝ ์•ฑ์—์„œ ํ…Œ์ŠคํŠธํ•ด์•ผ ํ•œ๋‹ค.

์•ฑ์—์„œ ํ† ํฐ์„ ๊ฐ€์ ธ์˜ค๋Š” API:

import * as Notifications from "expo-notifications";

const tokenInfo = await Notifications.getDevicePushTokenAsync();
const fcmToken = tokenInfo.data;

์ด๋ ‡๊ฒŒ ๋ฐ›์•„์˜จ FCM Token์„ ๋ฐฑ์—”๋“œ์— ์ €์žฅํ•ด์•ผ ํ•œ๋‹ค.


3. ๋ฐฑ์—”๋“œ(Firebase Admin SDK) ์„ค์ •

1) Admin SDK ์„ค์น˜

Firebase Console
→ ํ”„๋กœ์ ํŠธ ์„ค์ •
→ ์„œ๋น„์Šค ๊ณ„์ •
→ “์ƒˆ ๋น„๊ณต๊ฐœ ํ‚ค ์ƒ์„ฑ”

ํŒŒ์ผ๋ช… ์˜ˆ:

bimong-firebase-adminsdk-xxxx.json

Spring Boot ๋ฆฌ์†Œ์Šค ํด๋” ๋˜๋Š” Docker ์ปจํ…Œ์ด๋„ˆ ๋‚ด์— ๋„ฃ์€ ํ›„
application.properties์—์„œ ๊ฒฝ๋กœ ์„ค์ •:

firebase.service-account=/app/config/firebase-service-account.json

3) FirebaseApp ์ดˆ๊ธฐํ™”

@Configuration
public class FirebaseConfig {

    @Value("${firebase.service-account}")
    private String serviceAccountPath;

    @PostConstruct
    public void init() throws IOException {
        FileInputStream serviceAccount = new FileInputStream(serviceAccountPath);

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

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

4. ๋ฐฑ์—”๋“œ์—์„œ FCM์œผ๋กœ ํ‘ธ์‹œ ๋ณด๋‚ด๊ธฐ

1) ๋ฉ”์‹œ์ง€ DTO

public class PushMessageDTO {
    private String token;
    private String title;
    private String body;
}

2) ๋ฉ”์‹œ์ง€ ์ „์†ก ์„œ๋น„์Šค

@Service
public class FcmService {

    public void sendMessage(PushMessageDTO dto) throws Exception {

        Message message = Message.builder()
                .setToken(dto.getToken())
                .setNotification(
                        Notification.builder()
                                .setTitle(dto.getTitle())
                                .setBody(dto.getBody())
                                .build()
                )
                .build();

        String response = FirebaseMessaging.getInstance().send(message);
        System.out.println("FCM ์‘๋‹ต: " + response);
    }
}

FirebaseMessaging์€ FCM v1 API ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘๋™ํ•œ๋‹ค.


5. ์‹ค์ œ ๋™์ž‘ ํ๋ฆ„

  1. ์•ฑ ์‹คํ–‰ → FCM Token ๋ฐœ๊ธ‰
  2. ์•ฑ์ด ํ† ํฐ์„ ๋ฐฑ์—”๋“œ๋กœ ์ „์†ก
  3. ๋ฐฑ์—”๋“œ DB์— deviceId + fcmToken ์ €์žฅ
  4. ์Šค์ผ€์ค„๋Ÿฌ๋‚˜ ํŠน์ • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์—์„œ fcmToken ์กฐํšŒ
  5. Firebase Admin SDK → FCM ์„œ๋ฒ„์— ๋ฉ”์‹œ์ง€ ์ „์†ก
  6. FCM ์„œ๋ฒ„ → ๊ธฐ๊ธฐ(iOS/Android)๋กœ ์•Œ๋ฆผ ์ „๋‹ฌ
  7. ์•ฑ์ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ/๊บผ์ง„ ์ƒํƒœ์—ฌ๋„ ์•Œ๋ฆผ ์ˆ˜์‹ 

6. ์ •๋ฆฌ

ํ‘ธ์‹œ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋ ค๋ฉด:

  1. Firebase Cloud Messaging ์„ค์ •
  2. google-services.json / plist ํฌํ•จ๋œ EAS ์•ฑ ๋นŒ๋“œ
  3. ์•ฑ์—์„œ FCM Token ๋ฐœ๊ธ‰
  4. ๋ฐฑ์—”๋“œ์— ์ €์žฅ
  5. ๋ฐฑ์—”๋“œ์—์„œ Firebase Admin SDK๋กœ ํ‘ธ์‹œ

์ด ๊ตฌ์กฐ๊ฐ€ ์™„์„ฑ๋ผ์•ผ ๊ธฐ๊ธฐ์—์„œ ํ‘ธ์‹œ๊ฐ€ ์ •์ƒ ๋™์ž‘ํ•œ๋‹ค

๋ฐ˜์‘ํ˜•