콘솔로 이동

시작하기: 첫 번째 함수 작성 및 배포

English Context Link

Cloud 함수를 시작하려면 이 가이드를 따라해 보세요. 이 가이드는 필수 설정 작업부터 시작해 다음의 관련 함수 2개를 만들고 배포하는 과정을 설명합니다.

  • addMessage()는 텍스트 값이 허용되는 URL을 노출하고 실시간 데이터베이스에 이 값을 작성합니다.
  • makeUppercase()는 실시간 데이터베이스 쓰기에서 트리거되고 텍스트를 대문자로 변환합니다.

이 샘플에서는 실시간 데이터베이스와 HTTP 트리거 자바스크립트 함수를 선택했지만 이 외에도 다양한 함수 트리거 옵션을 사용할 수 있습니다. 인증 이벤트애널리틱스 이벤트와 같은 다른 백그라운드 트리거는 안내 가이드를 참조하세요. 또는 자바스크립트 대신 사용자 입력 값을 사용하려면 TypeScript로 함수 작성을 참조하세요.

이 가이드의 다음 섹션에서는 샘플을 빌드하고 배포하는 데 필요한 단계를 자세히 설명합니다. 그냥 코드를 실행하여 검사하고 싶으면 전체 샘플 코드 검토로 이동하세요.

Firebase 프로젝트 만들기

  1. Firebase Console에서 프로젝트 추가를 클릭한 후 프로젝트 이름을 선택 또는 입력합니다.

    기존 GCP(Google Cloud Platform) 프로젝트가 있으면 프로젝트 이름 드롭다운 메뉴에서 프로젝트를 선택할 수 있습니다. 기존 프로젝트가 없다면 프로젝트 이름을 새로 입력합니다.

  2. (선택사항) 프로젝트 ID를 수정합니다.

    Firebase는 Firebase 프로젝트에 자동으로 고유한 ID를 할당합니다. Firebase에서 프로젝트 ID를 사용하는 방법은 Firebase 프로젝트 이해를 참조하세요.

  3. Firebase Console에서 나머지 설정 단계를 따른 다음 프로젝트 만들기(또는 기존 Google 프로젝트를 사용 중인 경우 Firebase 추가)를 클릭합니다.

Firebase에서 Firebase 프로젝트용 리소스를 자동으로 프로비저닝합니다. 프로세스가 완료되면 Firebase Console에서 Firebase 프로젝트의 개요 페이지로 이동됩니다.

Node.js 및 Firebase CLI 설정

함수를 작성하려면 Node.js 환경이 필요하며 함수를 Cloud Functions 런타임에 배포하려면 Firebase CLI(Node.js와 npm도 필요)가 필요합니다. 시작할 때는 Cloud Functions에서 사용할 수 있는 지원되는 Node.js 버전 중에서도 특히 Node.js 8을 추천합니다. 노드 버전 관리자를 사용하여 Node.js와 npm을 설치하는 것이 좋습니다.

Node.js 및 npm이 설치되었으면 npm을 통해 Firebase CLI를 설치합니다.

npm install -g firebase-tools

이렇게 하면 디렉토리에 관계없이 사용할 수 있는 firebase 명령어가 설치됩니다. 명령어가 작동하지 않으면 npm 권한을 변경해야 할 수도 있습니다. firebase-tools의 최신 버전으로 업데이트하려면 같은 명령어를 다시 실행합니다.

Cloud 함수용 Firebase SDK 초기화

Cloud 함수용 Firebase SDK를 초기화하려면 종속 항목과 일부 최소 샘플 코드가 있는 빈 프로젝트를 만들고 함수 작성을 위해 TypeScript 또는 자바스크립트 중 하나를 선택합니다.

프로젝트를 초기화하는 방법은 다음과 같습니다.

  1. firebase login을 실행하여 브라우저를 통해 로그인하고 Firebase 도구를 인증합니다.
  2. Firebase 프로젝트 디렉토리로 이동합니다.
  3. firebase init functions를 실행합니다. 이 도구를 사용하면 npm으로 종속 항목을 설치할 수 있습니다. 종속 항목을 다른 방법으로 관리하려면 거부해도 됩니다.
  4. 이 도구는 언어 지원을 위한 두 가지 옵션을 제공합니다.

    이 가이드에서는 자바스크립트를 선택하세요.

이 명령어가 완료되면 프로젝트 구조는 다음과 같습니다.

myproject
 +- .firebaserc    # Hidden file that helps you quickly switch between
 |                 # projects with `firebase use`
 |
 +- firebase.json  # Describes properties for your project
 |
 +- functions/     # Directory containing all your functions code
      |
      +- .eslintrc.json  # Optional file containing rules for JavaScript linting.
      |
      +- package.json  # npm package file describing your Cloud Functions code
      |
      +- index.js      # main source file for your Cloud Functions code
      |
      +- node_modules/ # directory where your dependencies (declared in
                       # package.json) are installed

초기화 중에 생성된 package.json 파일에는 중요한 키인 "engines": {"node": "8"}이 포함되어 있습니다. 이는 함수 작성 및 배포를 위한 노드 버전을 의미합니다. 이 가이드에서 권장하는 Node.js 8(기본값) 외에도 지원되는 다른 버전을 선택할 수 있습니다.

필수 모듈 가져오기 및 앱 초기화

설정 작업을 완료했으면 소스 디렉토리를 열고 다음 섹션에 설명된 대로 코드를 추가할 수 있습니다. 이 샘플의 경우 프로젝트에서 노드 require 구문을 사용하여 Cloud 함수와 Admin SDK 모듈을 가져와야 합니다. index.js 파일에 다음과 같은 줄을 추가합니다.

// The Cloud Functions for Firebase SDK to create Cloud Functions and setup triggers.
const functions = require('firebase-functions');

// The Firebase Admin SDK to access the Firebase Realtime Database.
const admin = require('firebase-admin');
admin.initializeApp();

이 줄은 firebase-functionsfirebase-admin 모듈을 로드하며 실시간 데이터베이스를 변경할 수 있는 admin 앱 인스턴스를 초기화합니다. FCM, 인증, Firebase 실시간 데이터베이스의 경우처럼 Admin SDK가 지원되기만 하면 어디에서든 Cloud 함수를 사용하여 Firebase를 강력하게 통합할 수 있습니다.

프로젝트를 초기화하면 Firebase CLI가 자동으로 Cloud 함수 노드 모듈용 Firebase SDK 및 Firebase를 설치합니다. 프로젝트에 타사 라이브러리를 추가하려면 package.json을 수정하고 npm install을 실행합니다. 자세한 내용은 종속 항목 처리를 참조하세요.

addMessage() 함수 추가

addMessage() 함수의 경우 index.js에 다음 줄을 추가합니다.

// Take the text parameter passed to this HTTP endpoint and insert it into the
// Realtime Database under the path /messages/:pushId/original
exports.addMessage = functions.https.onRequest(async (req, res) => {
  // Grab the text parameter.
  const original = req.query.text;
  // Push the new message into the Realtime Database using the Firebase Admin SDK.
  const snapshot = await admin.database().ref('/messages').push({original: original});
  // Redirect with 303 SEE OTHER to the URL of the pushed object in the Firebase console.
  res.redirect(303, snapshot.ref.toString());
});

addMessage() 함수는 HTTP 엔드포인트입니다. 엔드포인트에 요청하면 ExpressJS 스타일의 요청응답 객체가 onRequest() 콜백으로 전달됩니다.

HTTP 함수는 동기 방식이므로(호출 가능 함수와 유사) 가능한 한 신속하게 응답을 보내고 실시간 데이터베이스를 사용하여 작업을 연기해야 합니다. addMessage() HTTP 함수는 HTTP 엔드포인트에 텍스트 값을 전달하고 이전에 초기화한 admin 앱을 사용하여 /messages/:pushId/original 경로 아래의 실시간 데이터베이스에 이 값을 삽입합니다.

addMessage() 배포 및 실행

addMessage() 함수를 배포하고 실행하려면 다음 단계를 따릅니다.

  1. 다음 명령어를 실행하여 함수를 배포합니다.

    $ firebase deploy --only functions
    

    이 명령을 실행하면 Firebase CLI가 HTTP 함수 엔드포인트의 URL을 출력합니다. 터미널에 다음과 같은 줄이 표시됩니다.

    Function URL (addMessage): https://us-central1-MY_PROJECT.cloudfunctions.net/addMessage
    

    URL에는 프로젝트 ID와 HTTP 함수의 지역이 포함됩니다. 지금은 이에 대해 신경 쓸 필요는 없지만, 일부 프로덕션 HTTP 함수는 네트워크 지연 시간을 최소화할 수 있는 위치를 지정해야 합니다.

  2. 텍스트 쿼리 매개변수를 addMessage() URL에 추가하고 브라우저에서 엽니다.

    https://us-central1-MY_PROJECT.cloudfunctions.net/addMessage?text=uppercaseme
    

    함수가 실행되고 텍스트 문자열이 저장된 데이터베이스 위치에서 Firebase Console로 브라우저를 리디렉션합니다. 콘솔에는 텍스트 값이 표시됩니다.

함수를 배포하고 실행한 후 Firebase Console에서 로그를 확인할 수 있습니다.

makeUppercase() 함수 추가

makeUppercase() 함수의 경우 index.js에 다음 줄을 추가합니다.

// Listens for new messages added to /messages/:pushId/original and creates an
// uppercase version of the message to /messages/:pushId/uppercase
exports.makeUppercase = functions.database.ref('/messages/{pushId}/original')
    .onCreate((snapshot, context) => {
      // Grab the current value of what was written to the Realtime Database.
      const original = snapshot.val();
      console.log('Uppercasing', context.params.pushId, original);
      const uppercase = original.toUpperCase();
      // You must return a Promise when performing asynchronous tasks inside a Functions such as
      // writing to the Firebase Realtime Database.
      // Setting an "uppercase" sibling in the Realtime Database returns a Promise.
      return snapshot.ref.parent.child('uppercase').set(uppercase);
    });

실시간 데이터베이스를 작성하면 makeUppercase() 함수가 실행됩니다. ref(path) 함수는 리슨할 데이터베이스 부분을 정의합니다. 성능을 높이려면 최대한 구체적으로 정의해야 합니다.

중괄호(예: {pushId})는 콜백에서 일치하는 데이터를 노출하는 와일드 카드인 '매개변수'를 둘러쌉니다.

지정된 경로에 데이터가 작성되거나 업데이트될 때마다 실시간 데이터베이스가 onWrite() 콜백을 트리거합니다.

실시간 데이터베이스 이벤트와 같은 이벤트 기반 함수는 비동기 방식입니다. 콜백 함수는 null, 객체, 프라미스 중 하나를 반환해야 합니다. 아무 것도 반환하지 않으면 오류 표시와 함께 함수 시간이 초과되고 다시 시도됩니다. 동기, 비동기, 프라미스를 참조하세요.

makeUppercase() 배포 및 실행

가이드를 완료하려면 함수를 다시 배포한 다음 addMessage()를 실행하여 makeUppercase()를 트리거합니다.

  1. 다음 명령어를 실행하여 함수를 배포합니다.

    $ firebase deploy --only functions
    

    '프로젝트에 대한 액세스를 승인할 수 없음'처럼 액세스 오류가 발생하면 프로젝트 별칭 설정을 확인해 보세요.

  2. CLI의 addMessage() URL 출력을 사용하여 텍스트 쿼리 매개변수를 추가하고 브라우저에서 엽니다.

    https://us-central1-MY_PROJECT.cloudfunctions.net/addMessage?text=uppercasemetoo
    

    함수가 실행되고 텍스트 문자열이 저장된 데이터베이스 위치에서 Firebase Console로 브라우저를 리디렉션합니다. 이 쓰기 이벤트는 문자열의 대문자 버전을 작성하는 makeUppercase()를 트리거합니다.

함수를 배포하고 실행한 후 Cloud Functions용 Firebase Console에서 로그를 확인할 수 있습니다. 개발 또는 프로덕션 단계에서 함수를 삭제해야 할 경우 Firebase CLI를 사용하세요.

전체 샘플 코드 검토

addMessage()makeUppercase() 함수가 포함된 완료된 functions/index.js는 다음과 같습니다. 이러한 함수를 사용하면 실시간 데이터베이스에 값을 작성하는 HTTP 엔드포인트에 매개변수를 전달한 후 문자열의 모든 문자를 대문자로 변환할 수 있습니다.

// The Cloud Functions for Firebase SDK to create Cloud Functions and setup triggers.
const functions = require('firebase-functions');

// The Firebase Admin SDK to access the Firebase Realtime Database.
const admin = require('firebase-admin');
admin.initializeApp();

// Take the text parameter passed to this HTTP endpoint and insert it into the
// Realtime Database under the path /messages/:pushId/original
exports.addMessage = functions.https.onRequest(async (req, res) => {
  // Grab the text parameter.
  const original = req.query.text;
  // Push the new message into the Realtime Database using the Firebase Admin SDK.
  const snapshot = await admin.database().ref('/messages').push({original: original});
  // Redirect with 303 SEE OTHER to the URL of the pushed object in the Firebase console.
  res.redirect(303, snapshot.ref.toString());
});

// Listens for new messages added to /messages/:pushId/original and creates an
// uppercase version of the message to /messages/:pushId/uppercase
exports.makeUppercase = functions.database.ref('/messages/{pushId}/original')
    .onCreate((snapshot, context) => {
      // Grab the current value of what was written to the Realtime Database.
      const original = snapshot.val();
      console.log('Uppercasing', context.params.pushId, original);
      const uppercase = original.toUpperCase();
      // You must return a Promise when performing asynchronous tasks inside a Functions such as
      // writing to the Firebase Realtime Database.
      // Setting an "uppercase" sibling in the Realtime Database returns a Promise.
      return snapshot.ref.parent.child('uppercase').set(uppercase);
    });

다음 단계

이 문서에서는 Cloud Functions의 일반적인 개념과 더불어 Cloud Functions에서 지원하는 이벤트 유형을 처리하기 위한 함수 작성 가이드를 자세히 알아볼 수 있습니다.

또한 Cloud 함수를 자세히 알아보려면 다음을 수행하세요.

동영상 가이드

동영상 가이드를 시청하면 Cloud 함수를 자세히 알아볼 수 있습니다. 이 동영상에서 Node.js 및 CLI 설정을 포함해 Cloud Functions를 시작하는 방법에 대한 자세한 가이드를 확인할 수 있습니다.