Firebase Summit에서 발표된 모든 내용을 살펴보고 Firebase로 앱을 빠르게 개발하고 안심하고 앱을 실행하는 방법을 알아보세요. 자세히 알아보기

사용자 정의 이벤트 트리거 생성 및 처리

컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.

Cloud Functions(2세대)를 사용하면 맞춤 이벤트 에 대한 응답으로 함수를 트리거할 수 있습니다. 이는 Cloud Functions용 ​​Firebase SDK에서 기본적으로 지원하는 Firebase 이벤트와 달리 특수 또는 추가 이벤트 공급자가 제공하는 이벤트입니다. 맞춤 이벤트 트리거를 통해 앱은 Firebase Extensions에서 제공하는 이벤트에 응답하거나 자체 맞춤 이벤트를 게시하고 이에 대한 응답으로 함수를 트리거할 수 있습니다.

모든 사용자 지정 이벤트는 CloudEvents JSON 이벤트 형식 을 준수하며 Eventarc 에 게시됩니다. Eventarc 사용료 가 부과됩니다.

사용자 지정 이벤트로 함수 트리거

이 기본 흐름을 구현하여 맞춤 이벤트를 게시(또는 Firebase 확장 프로그램에서 이벤트 가져오기)하고 해당 이벤트에 대한 응답으로 함수를 트리거할 수 있습니다.

  1. 원하는 이벤트를 Eventarc 채널에 게시하거나 설치한 확장 프로그램에서 제공하는 사용 가능한 이벤트를 식별합니다.
  2. 함수 코드에서 onCustomEventPublished 핸들러를 사용하여 Eventarc 채널의 이벤트를 구독합니다.
  3. 함수에서 CloudEvent 개체에 반환된 페이로드를 구문 분석하고 앱에 필요한 모든 사용자 지정 논리를 수행합니다.

예를 들어, 게임 앱은 사용자가 상위 10개 경쟁사의 순위표에 들어가거나 나올 때 사용자에게 알림을 보내려고 할 수 있습니다. 이 앱은 순위표 이벤트를 기본 채널에 게시한 다음 대상 푸시 알림을 사용자에게 보내는 함수에서 이벤트를 처리할 수 있습니다.

또 다른 예로, 앱이 큰 이미지를 처리하는 데 도움이 되도록 설계된 확장 프로그램은 이미지 크기 조정 완료 시 이벤트를 내보낼 수 있습니다. 이 확장 프로그램이 설치된 앱은 크기가 조정된 버전의 이미지를 가리키도록 앱의 링크를 업데이트하여 완료 이벤트를 처리할 수 있습니다.

채널에 이벤트 게시

Eventarc 이벤트는 채널 에 게시됩니다. 채널은 관련 이벤트를 그룹화하고 액세스 권한을 관리하는 방법입니다. 확장 프로그램을 설치하거나 맞춤 이벤트를 사용하는 함수를 배포하면 firebaseus-central1 지역에 firebase라는 기본 채널을 자동으로 생성합니다. Firebase Admin SDK는 채널에 게시하기 위한 eventarc 하위 패키지를 제공합니다.

기본 채널을 사용하여 신뢰할 수 있는 서버(또는 다른 기능)에서 이벤트를 게시하려면:

import {getEventarc} from 'firebase-admin/eventarc';

getEventarc().channel().publish({
    type: 'achieved-leaderboard',
    subject: 'Welcome to the top 10',
    data: {
      message: 'You have achieved the nth position in our leaderboard!  To see . . .'
    }
});

기본 채널을 자동으로 생성하는 것 외에도 Firebase는 이벤트 소스를 지정하는 환경 변수 EVENTARC_CLOUD_EVENT_SOURCE 를 설정합니다. Firebase용 Cloud Functions 외부에서 이벤트를 게시하는 경우 이벤트 페이로드에 source 필드를 명시적으로 추가해야 합니다.

onCustomEventPublished 로 이벤트 처리

onCustomEventPublished 핸들러를 사용하여 확장 이벤트를 포함한 모든 사용자 정의 이벤트를 처리할 수 있습니다. 먼저 Eventarc SDK에서 맞춤 로직을 위한 Node.js용 Firebase Admin SDK 및 오류 처리를 위한 logger SDK와 함께 이 핸들러를 가져옵니다.

const {onCustomEventPublished} = require("firebase-functions/v2/eventarc");
const logger = require("firebase-functions/logger");
const {initializeApp} = require("firebase-admin/app");
const {getFirestore} = require("firebase-admin/firestore");

함수 코드에서 예제 함수 onimageresized 에 표시된 대로 이벤트 이름을 전달합니다.

exports.onimageresized = onCustomEventPublished(
    "firebase.extensions.storage-resize-images.v1.complete",
    (event) => {
      logger.info("Received image resize completed event", event);
      // For example, write resized image details into Firestore.
      return getFirestore()
          .collection("images")
          .doc(event.subject.replace("/", "_")) // original file path
          .set(event.data); // resized images paths and sizes
    });

각각의 특정 확장에 대해 이벤트 개체에 반환된 페이로드는 애플리케이션 흐름에 대한 사용자 지정 논리를 수행하는 데 사용할 수 있는 데이터를 제공합니다. 이 경우 함수는 Admin SDK를 사용하여 크기 조정된 이미지에 대한 메타데이터를 Cloud Firestore의 컬렉션에 복사하고, 이벤트에서 제공하는 subject 에서 파일 이름을 가져오고, 이벤트에서 제공하는 data 에서 메타데이터를 저장합니다.

기본이 아닌 채널에서 이벤트 게시 및 처리

사용자 지정 채널은 특별한 권한이나 기타 요구 사항이 있고 모든 이벤트에 대해 동일한 수준의 가시성과 액세스를 원하지 않는 경우에 유용할 수 있습니다. Google Cloud Console 을 사용하여 나만의 채널을 만들 수 있습니다. 이벤트 게시 및 구독은 동일한 채널에서 수행되어야 합니다.

맞춤 이벤트가 기본이 아닌 채널에 게시되는 경우 함수 코드에서 채널을 지정해야 합니다. 예를 들어 us-west1 위치에 대해 기본이 아닌 채널에 게시된 이벤트를 처리하려면 다음과 같이 채널을 지정해야 합니다.

import { onCustomEventPublished } from "firebase-functions/v2/eventarc";

export const func = onCustomEventPublished(
    {
      eventType: "firebase.extensions.storage-resize-images.v1.complete",
      channel: "locations/us-west1/channels/firebase",
      region: "us-west1",
    },
    (event) => { ... });