[PWA] FCM 모바일 알림 구현하기 (Vue.js)

2024. 9. 18. 00:35·etc/이것저것

현재 진행중인 프로젝트에서 모바일 알림을 구현해야 했다. 그래서 가장 간편하게 쓸 수 있다는 FCM을 사용해 보았는데 나중에 까먹을 것 같아서 남겨두려고 작성한다. 

FCM(Firebase Cloud Messaging) 이란?

firebase에서 제공하는 서비스 중 하나로 여러 플랫폼에 푸시 메세지를 보낼 수 있다. iOS, 안드로이드, 웹 모두 지원하므로 쉽게 사용 가능하다는 장점이 있다. 

 

공식 문서가 잘 작성되어 있어 처음 사용해보는 사람들도 쉽게 접근할 수 있어서 좋았던 것 같다.

 

개발 환경 ⚙️

나는 Vue를 사용하고 있으므로 vue/cli-plugin-pwa 플러그인을 설치했다. 그런데 파이어베이스에서 서비스 워커를 줘서 제공되는registerServiceWorker.js 에서는 따로 구현하지 않았다. 

 

 그리고 firebase/config.js 파일에 파이어베이스 초기화 부분을 넣었고, 권한 요청 부분을 service/notificationPermission.js 파일에 구현했다. 마지막으로 백그라운드 사용을 위해서 public/firebase-messaging-sw.js 파일을 넣었다. 이 파일은 공식 문서에서도 나와있듯이 반드시 프로젝트 루트에 넣어야 한다. 

사용 방법

먼저 파이어베이스 프로젝트를 만들어야 한다. firebase 사이트에서 프로젝트를 생성한다.     

 

그 다음 프로젝트 터미널에서 파이어베이스를 설치한다.

npm install firebase

 

firebase 초기화 

//firebase/config.js

import { initializeApp } from 'firebase/app';
import { getMessaging } from "firebase/messaging";

const firebaseConfig = {
/*
  여기부터는 본인 프로젝트에 맞는 데이터 넣으시면 됩니다. 
  ex) 
  apiKey: process.env.VUE_APP_FIREBASE_API_KEY,
  authDomain: process.env.VUE_APP_FIREBASE_AUTH_DOMAIN,
  projectId: process.env.VUE_APP_FIREBASE_PROJECT_ID,
  storageBucket: process.env.VUE_APP_FIREBASE_STORAGE_BUCKET,
  messagingSenderId: process.env.VUE_APP_FIREBASE_MESSAGING_SENDER_ID,
  appId: process.env.VUE_APP_FIREBASE_APP_ID,
  measurementId: process.env.VUE_APP_FIREBASE_MEASUREMENT_ID,
 */
};

const app = initializeApp(firebaseConfig);

// FCM 메시징 설정
const messaging = getMessaging(app);

export { messaging };

 

이 파일에서는 파이어베이스를 초기화 하고 메세징 객체를 설정한다. 이 파일에서 내보낸 messaging을 이용하여 푸시 알림을 보낸다. 

 

알림을 보내기 위해서는 토큰과 권한이 필요하다. 먼저 권한을 승인하면 해당 기기의 토큰이 발급되고 이 토큰을 이용해 사용자를 알 수 있다. 아래 코드는 권한 요청과 토큰 발급 코드이다. 

//service/notificationPermission.js

import { getToken } from "firebase/messaging";
import { messaging } from "../firebase/config";

export function requestFCMPermission() {
  // Notification 권한 요청
  console.log('권한을 요청하는 중...');
  
  Notification.requestPermission().then((permission) => {
    if (permission === 'granted') {
      console.log('알림 권한이 부여되었습니다.');
      
      // FCM 토큰 요청
      getToken(messaging, { vapidKey: process.env.VAPID_KEY })
        .then((currentToken) => {
          if (currentToken) {
            console.log('FCM Token:', currentToken);
          } else {
            console.log('권한을 허용해주세요');
          }
        })
        .catch((err) => {
          console.log('푸시 토큰 가져오는 중에 에러 발생', err);
        });
      
    } else {
      console.log('권한을 얻을 수 없습니다.');
    }
  });
}

 

이렇게 설정이 끝났으면 테스트를 해야한다. 테스트를 하기에 앞서 토큰을 알아야 하는데 방금 작성한 requestFCMPermission 메서드를 main.js에서 불러와서 실행하면 콘솔창에 본인의 토큰이 나올 것 이다.

 

그 토큰을 가지고 다시 파이어 베이스로 간다. 그리고 클라우드 메세징 클릭

 

첫번째 캠페인 만들기 선택 후 알림 제목과 설명을 입력하면 토큰을 추가할 수 있는 버튼이 나온다. 여기에 아까 받은 토큰을 입력한다.

 

백그라운드 알림을 보내기 위해서는 루트에 firebase-messaging-sw.js 파일이 있어야 한다. 나는 public 폴더에 만들었으며 코드는 아래와 같다.

// /public/firebase-messaging-sw.js
importScripts(
    "https://www.gstatic.com/firebasejs/10.8.0/firebase-app-compat.js"
);
importScripts(
    "https://www.gstatic.com/firebasejs/10.8.0/firebase-messaging-compat.js"
);

self.addEventListener("install", function (e) {
    console.log("fcm service worker가 설치되었습니다.");
    self.skipWaiting();
});

self.addEventListener("activate", function (e) {
    console.log("fcm service worker가 실행되었습니다.");
});

const firebaseConfig = {
    apiKey: '',
    authDomain: '',
    projectId: '',
    storageBucket: '',
    messagingSenderId: '',
    appId: '',
    measurementId: '',
};

// 파이어베이스 초기화
firebase.initializeApp(firebaseConfig);

const messaging = firebase.messaging();

messaging.onBackgroundMessage((payload) => {
    const notificationTitle = payload.title;
    const notificationOptions = {
        body: payload.body
    };
    self.registration.showNotification(notificationTitle, notificationOptions);
});

src에 없으므로 .env 파일이나 inport 를 직접 해주어야 한다. 나는 이 부분에서 왜 파이어베이스를 또 초기화 하는지 궁금했었는데 초기화를 두 번 하는 이유는 애플리케이션 실행 환경과 서비스 워커 실행 환경이 서로 다르기 때문이다.

 

쉽게 말해서 앱이 꺼져있을 때 알림이 오면 파이어베이스 객체를 생성해야 하기 때문이다. 

 

아무튼 이거 생성하고 테스트를 보내면 끝! 

 

추가로 Mac에서는 설정에서 크롬 알림을 또 켜줘야 한다

 

암튼 이렇게 하면 드디어 끝!!!!!

반응형
저작자표시 (새창열림)

'etc > 이것저것' 카테고리의 다른 글

[PWA] React + Vite 프로젝트 PWA 적용  (1) 2025.03.15
2024 3회차 정보처리기사 실기 합격 후기  (3) 2024.11.16
2024 정보처리기사 실기 (2) 데이터베이스 구축  (0) 2024.07.24
정보처리기사 실기 (1) 소프트웨어 구조 요약  (0) 2024.07.18
2024 1회 정보처리기사 필기 합격 후기  (2) 2024.02.17
'etc/이것저것' 카테고리의 다른 글
  • [PWA] React + Vite 프로젝트 PWA 적용
  • 2024 3회차 정보처리기사 실기 합격 후기
  • 2024 정보처리기사 실기 (2) 데이터베이스 구축
  • 정보처리기사 실기 (1) 소프트웨어 구조 요약
re-hwi
re-hwi
재휘의 개발일기
    반응형
  • re-hwi
    Dvelopment blog
    re-hwi
  • 전체
    오늘
    어제
    • 재휘의 개발일기 (168)
      • 개발 (1)
        • 소프트웨어 공학 (25)
      • Python (18)
        • numpy (8)
      • OS (23)
        • 쉽게 배우는 운영체제 (23)
      • Front end (1)
        • HTML (6)
        • CSS (9)
        • JavaScript (18)
        • React (2)
        • Vue.js (5)
        • TypeScript (5)
        • Sass (3)
      • Algorithm (1)
        • 파이썬 알고리즘 인터뷰 (2)
        • 자료구조와 함께 배우는 알고리즘 (20)
      • Android (2)
        • 안드로이드 앱 프로그래밍 with 코틀린 (2)
      • Project (15)
      • Network (0)
      • etc (12)
        • 이것저것 (10)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    vue
    자료흐름도
    플레이리스트
    pwa
    알고리즘
    HTML
    리액트
    오블완
    자료구조
    REACT
    개발
    js
    JavaScript
    scss
    FE
    정처기
    numpy
    프론트엔드
    정보처리기사
    표
    연결리스트
    typeScript
    티스토리챌린지
    TS
    타입스크립트
    파이썬
    뷰
    CSS
    컴포넌트
    sass
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
re-hwi
[PWA] FCM 모바일 알림 구현하기 (Vue.js)
상단으로

티스토리툴바