Firebase 및 App Engine 가변형 환경을 사용하여 iOS 앱 빌드

이 가이드에서는 Firebase를 사용하여 백엔드 데이터 스토리지, 실시간 동기화, 사용자 이벤트 로깅 기능을 갖춘 iOS 앱을 제작하는 방법을 보여줍니다. App Engine 가변형 환경에서 실행되는 자바 서블릿은 Firebase에 저장된 새로운 사용자 로그를 리슨하고 처리합니다.

이 안내에서는 FirebaseApp Engine 가변형 환경을 사용하여 이 작업을 진행하는 방법을 보여줍니다.

앱에서 사용자 데이터를 처리하거나 이벤트를 조정하도록 하려면 App Engine 가변형 환경에서 Firebase를 확장하여 실시간 데이터 동기화를 자동으로 수행할 수 있습니다.

샘플 앱인 Playchat은 Firebase 실시간 데이터베이스에 채팅 메시지를 저장하고 기기의 데이터를 자동으로 동기화합니다. Playchat은 Firebase에 사용자 이벤트 로그도 기록합니다. 데이터베이스가 데이터를 동기화하는 방법에 대한 자세한 내용은 Firebase 문서에서 기본 원리를 참조하세요.

다음 다이어그램에는 Playchat 클라이언트 아키텍처가 나와 있습니다.

Playchat 클라이언트 아키텍처

App Engine 가변형 환경에서 실행되는 자바 서블릿 세트는 Firebase에 리스너로 등록됩니다. 서블릿은 새로운 사용자 이벤트 로그에 응답하고 로그 데이터를 처리합니다. 서블릿은 트랜잭션을 사용하여 서블릿 하나가 사용자 이벤트 로그 하나만 처리하도록 합니다.

다음 다이어그램에는 Playchat 서버 아키텍처가 나와 있습니다.

Playchat 서버 아키텍처

앱과 서블릿 간의 통신은 세 부분으로 이루어집니다.

  • 새로운 사용자가 Playchat에 로그인하면 앱은 Firebase 실시간 데이터베이스의 /inbox/ 아래에 항목을 추가하여 해당 사용자의 로깅 서블릿을 요청합니다.

  • 서블릿 중 하나는 항목 값을 서블릿 식별자로 업데이트하여 할당을 수락합니다. 서블릿은 Firebase 트랜잭션을 사용하여 값을 업데이트할 수 있는 유일한 서블릿임을 보장합니다. 값이 업데이트되면 다른 모든 서블릿이 요청을 무시합니다.

  • 사용자가 로그인하거나 로그아웃하거나 새 채널로 변경하면 Playchat은 /inbox/[SERVLET_ID]/[USER_ID]/에 작업을 로깅합니다. 여기서 [SERVLET_ID]는 서블릿 인스턴스의 식별자이고 [USER_ID]는 사용자를 나타내는 해시 값입니다.

  • 서블릿은 받은편지함에서 새 항목을 감시하고 로그 데이터를 수집합니다.

이 샘플 앱에서 서블릿은 로그 데이터를 로컬에서 복사해서 웹페이지에 표시합니다. 이 앱의 프로덕션 버전에서 서블릿은 로그 데이터를 처리하거나 스토리지 및 분석을 위해 데이터를 Cloud Storage, Cloud Bigtable, BigQuery에 복사합니다.

목표

이 가이드에서는 다음 작업을 수행하는 방법을 보여줍니다.

  • Firebase 실시간 데이터베이스에 데이터를 저장하는 iOS 앱인 Playchat을 빌드합니다.

  • Firebase에 연결하여 Firebase에 저장된 데이터가 변경되면 알림을 받는 App Engine 가변형 환경에서 자바 서블릿을 실행합니다.

  • 2가지 구성요소를 사용하여 로그 데이터를 수집하고 처리하는 분산형 스트리밍 백엔드 서비스를 빌드합니다.

비용

Firebase에는 무료로 제공되는 사용량이 있습니다. Firebase의 총 사용량이 Firebase 무료 할당량에 지정된 한도보다 낮을 경우 이 가이드를 완료하는 데 비용이 들지 않습니다.

App Engine 가변형 환경 내의 인스턴스에는 기본 Compute Engine 가상 머신에 대한 비용이 청구됩니다.

시작하기 전에

다음 소프트웨어를 설치합니다.

터미널 창에서 다음 명령어를 실행하여 Cloud SDK의 App Engine 자바 구성요소를 설치합니다.

gcloud components install app-engine-java

샘플 코드 복제

  1. 클라이언트 앱 코드를 복제합니다.

    git clone https://github.com/GoogleCloudPlatform/firebase-ios-samples
    
  2. 백엔드 서블릿 코드를 복제합니다.

    git clone https://github.com/GoogleCloudPlatform/firebase-appengine-backend
    

Firebase 프로젝트 만들기

  1. Firebase 계정을 만들거나 기존 계정에 로그인합니다.

  2. 프로젝트 추가를 클릭합니다.

  3. 프로젝트 이름Playchat을 입력합니다. 본 가이드에 언급된 여러 단계에서 사용해야 하므로 프로젝트에 할당된 프로젝트 ID를 기록합니다.

  4. 나머지 설정 단계를 따르고 프로젝트 만들기를 클릭합니다.

  5. 마법사가 프로젝트를 프로비저닝하면 계속을 클릭합니다.

  6. 프로젝트의 개요 페이지에서 설정 톱니바퀴를 클릭한 다음 프로젝트 설정을 클릭합니다.

  7. iOS 앱에 Firebase 추가를 클릭합니다.

  8. iOS 번들 IDcom.google.cloud.solutions.flexenv.PlayChat을 입력합니다.

  9. 앱 등록을 클릭합니다.

  10. 구성 파일 다운로드 섹션의 단계에 따라 GoogleService-Info.plist 파일을 프로젝트의 PlayChat 폴더에 추가합니다.

  11. 구성 파일 다운로드 섹션에서 다음을 클릭합니다.

  12. CocoaPods를 사용하여 프로젝트 종속 항목을 설치하고 관리하는 방법을 기록해 둡니다. 샘플 코드에 CocoaPods 종속 항목 관리자가 이미 구성되어 있습니다.

  13. 다음 명령어를 실행하여 종속 항목을 설치합니다. 명령어를 실행하는 데 오랜 시간이 걸릴 수도 있습니다.

    pod install
    

    CocoaPods 설치 과정에서 Firebase 종속 항목을 찾을 수 없으면 pod repo update를 실행해야 할 수 있습니다.

    이 단계를 마친 후, 향후에 진행될 모든 iOS 앱 개발에 사용할 수 있도록 .xcodeproj 파일 대신 새로 생성한 .xcworkspace 파일을 사용합니다.

  14. Firebase SDK 추가 섹션에서 다음을 클릭합니다.

  15. 프로젝트에서 Firebase를 초기화하는 데 필요한 코드를 적어 둡니다.

  16. 초기화 코드 추가 섹션에서 다음을 클릭합니다.

  17. 앱을 실행하여 설치 확인 섹션에서 이 단계 건너뛰기를 클릭합니다.

실시간 데이터베이스 만들기

  1. Firebase Console에서 프로젝트를 선택합니다.

  2. Console 왼쪽 메뉴에서 개발 그룹의 데이터베이스를 선택합니다.

  3. 데이터베이스 페이지의 실시간 데이터베이스 섹션에서 데이터베이스 만들기를 클릭합니다.

  4. 실시간 데이터베이스의 보안 규칙 대화상자에서 테스트 모드에서 시작을 선택한 다음 사용 설정을 클릭합니다.

    이 단계는 Firebase에 저장한 데이터를 표시합니다. 가이드의 뒷부분에 나오는 단계에서 이 웹페이지를 다시 방문하여 클라이언트 앱 및 백엔드 서블릿을 통해 추가 및 업데이트된 데이터를 확인할 수 있습니다.

  5. 데이터베이스의 규칙 탭에서 읽기/쓰기에 대한 보안 규칙이 있는지 확인합니다. 예를 들면 다음과 같습니다.

    {
      "rules": {
        ".read": true,
        ".write": true
      }
    }
    
  6. 링크 아이콘 옆에 표시되는 https://[FIREBASE_PROJECT_ID].firebaseio.com/ 형식인 프로젝트의 Firebase URL을 적어 둡니다.

Firebase 프로젝트에 Google 인증 사용

다양한 로그인 제공업체를 사용하여 Firebase 프로젝트에 연결하도록 구성할 수 있습니다. 이 가이드에서는 사용자가 Google 계정을 사용하여 로그인할 수 있도록 인증 설정 과정을 안내합니다.

  1. Firebase Console의 왼쪽 메뉴에서 개발 그룹의 인증을 클릭합니다.

  2. 로그인 방법 설정을 클릭합니다.

  3. Google을 선택하고 사용으로 전환한 다음 저장을 클릭합니다.

Firebase 프로젝트에 서비스 계정 추가

백엔드 서블릿은 Google 계정을 사용하여 로그인하지 않습니다. 대신, 서비스 계정을 사용하여 Firebase에 연결합니다. 다음 단계는 Firebase에 연결할 수 있는 서비스 계정을 만들고 서블릿 코드에 서비스 계정 사용자 인증 정보를 추가하는 과정을 안내합니다.

  1. Firebase Console의 왼쪽 메뉴에서 Playchat 프로젝트 홈 옆에 있는 설정 톱니바퀴를 선택한 다음 프로젝트 설정을 선택합니다.

  2. 서비스 계정을 선택한 다음 서비스 계정 권한 관리 링크를 클릭합니다.

  3. 서비스 계정 만들기를 클릭합니다.

  4. 다음 설정을 구성합니다.

    1. 서비스 계정 이름playchat-servlet을 입력한 후 만들기를 클릭합니다.
    2. 역할 선택에서 프로젝트 > 소유자를 선택한 후 계속을 클릭합니다.

    3. 완료를 클릭합니다.

  5. 방금 만든 서비스 계정을 클릭하고 키 추가를 클릭한 후 새 키 만들기를 클릭합니다.

  6. 키 유형 옆에 있는 JSON을 클릭한 후 만들기를 클릭하여 키를 다운로드합니다.

  7. 다운로드한 서비스 계정의 JSON 키 파일을 src/main/webapp/WEB-INF/ 디렉터리에 있는 백엔드 서비스 프로젝트 firebase-appengine-backend에 저장합니다. 파일 이름은 Playchat-[UNIQUE_ID].json 형식입니다.

  8. src/main/webapp/WEB-INF/web.xml을 편집하고 초기화 매개변수를 다음과 같이 편집합니다.

    • JSON_FILE_NAME을 다운로드한 JSON 키 파일 이름으로 바꿉니다.

    • FIREBASE_URL을 앞에서 적어둔 Firebase URL로 바꿉니다.

      <init-param>
        <param-name>credential</param-name>
        <param-value>/WEB-INF/JSON_FILE_NAME</param-value>
      </init-param>
      <init-param>
        <param-name>databaseUrl</param-name>
        <param-value>FIREBASE_URL</param-value>
      </init-param>
      

Google Cloud 프로젝트에 대한 결제 및 API 사용

GCP에서 백엔드 서비스를 실행하려면 프로젝트에 대한 결제 및 API를 사용 설정해야 합니다. 클라우드 프로젝트는 Firebase 프로젝트 만들기에서 만든 것과 동일한 프로젝트이며 동일한 프로젝트 식별자가 있습니다.

  1. Google Cloud Console에서 PlayChat 프로젝트를 선택합니다.

    프로젝트 페이지로 이동

  2. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다. 프로젝트에 결제가 사용 설정되어 있는지 확인하는 방법을 알아보세요.

  3. App Engine Admin and Compute Engine API를 사용 설정합니다.

    API 사용 설정

백엔드 서비스 빌드 및 배포

이 샘플의 백엔드 서비스는 Docker 구성을 사용하여 호스팅 환경을 지정합니다. 이 맞춤설정에서는 App Engine 표준 환경 대신 App Engine 가변형 환경을 사용해야 합니다.

백엔드 서블릿을 빌드하여 App Engine 가변형 환경에 배포하려면 Google App Engine Maven 플러그인을 사용합니다. 이 플러그인은 샘플에 포함된 Maven 빌드 파일에 이미 지정되어 있습니다.

프로젝트 설정

Maven에서 백엔드 서블릿을 올바르게 빌드하려면 서블릿 리소스를 실행할 Google Cloud Platform(GCP) 프로젝트를 제공해야 합니다. GCP 프로젝트 식별자와 Firebase 프로젝트 식별자는 동일합니다.

  1. gcloud 도구가 GCP에 액세스하는 데 사용하는 사용자 인증 정보를 제공합니다.

    gcloud auth login
    
  2. 다음 명령어를 사용하여 프로젝트를 Firebase 프로젝트로 설정합니다. 여기서 [FIREBASE_PROJECT_ID]를 앞에서 언급한 Firebase 프로젝트 ID의 이름으로 바꿉니다.

    gcloud config set project [FIREBASE_PROJECT_ID]
    
  3. 구성을 나열하여 프로젝트가 설정되었는지 확인합니다.

    gcloud config list
    
  4. App Engine을 처음 사용하는 경우 App Engine 앱을 초기화합니다.

    gcloud app create
    

(선택사항) 로컬 서버에서 서비스 실행

새 백엔드 서비스를 개발할 때 App Engine에 배포하기 전에 서비스를 로컬에서 실행하여 App Engine에 전체 배포로 인한 오버헤드 없이 빠르게 변경을 반복합니다.

서버를 로컬에서 실행하는 경우 Docker 구성을 사용하거나 App Engine 환경에서 실행하지 않습니다. 대신 Maven은 모든 종속 항목 라이브러리가 로컬에 설치되어 있고 앱이 Jetty 웹 서버에서 실행되도록 합니다.

  1. firebase-appengine-backend 디렉터리에서 다음 명령어를 사용하여 백엔드 모듈을 로컬에서 실행합니다.

    mvn clean package appengine:run
    

    gcloud 명령줄 도구를 ~/google-cloud-sdk 이외의 디렉터리에 설치했다면 다음과 같이 [PATH_TO_TOOL]을 커스텀 경로로 바꿔 설치 경로를 명령어에 추가하세요.

    mvn clean package appengine:run -Dgcloud.gcloud_directory=[PATH_TO_TOOL]
    
  2. 'Python.app' 애플리케이션에서 수신되는 네트워크 연결을 허용하시겠습니까?라는 메시지가 표시되면 허용을 선택합니다.

배포가 끝나면 http://localhost:8080/printLogs를 열고 백엔드 서비스가 실행 중인지 확인합니다. 웹페이지에 받은편지함:이 표시되고 그 뒤에 16자리 식별자가 표시됩니다. 이는 로컬 머신에서 실행되는 서블릿의 받은편지함 식별자입니다.

페이지를 새로고침할 때 이 식별자는 변경되지 않으며 로컬 서버는 단일 서블릿 인스턴스를 가동합니다. Firebase 실시간 데이터베이스에 저장된 서블릿 식별자는 하나이므로 테스트 시 유용합니다.

로컬 서버를 종료하려면 Ctrl+C를 입력합니다.

App Engine 가변형 환경에 서비스 배포

App Engine 가변형 환경에서 백엔드 서비스를 실행하면 App Engine은 /firebase-appengine-backend/src/main/webapp/Dockerfiles의 구성을 사용하여 서비스가 실행되는 호스팅 환경을 구축합니다. 가변형 환경은 여러 서블릿 인스턴스를 가동하고 수요에 맞춰 인스턴스를 확장 및 축소합니다.

  • firebase-appengine-backend 디렉터리에서 다음 명령어를 사용하여 백엔드 모듈을 로컬에서 실행합니다.

    mvn clean package appengine:deploy
    
    mvn clean package appengine:deploy -Dgcloud.gcloud_directory=[PATH_TO_GCLOUD]
    

빌드가 실행되면 'Docker 데몬에 빌드 컨텍스트를 보내는 중…' 행이 표시됩니다. 이전 명령어는 Docker 구성을 업로드하여 App Engine 가변형 환경에서 설정합니다.

배포가 끝나면 https://[FIREBASE_PROJECT_ID].appspot.com/printLogs를 엽니다. 여기서 [FIREBASE_PROJECT_ID]Firebase 프로젝트 만들기의 식별자입니다. 웹페이지에 받은편지함:이 표시되고 그 뒤에 16자리 식별자가 표시됩니다. 이는 App Engine 가변형 환경에서 실행되는 서블릿에 대한 받은편지함 식별자입니다.

App Engine이 여러 서블릿 인스턴스를 가동하여 들어오는 클라이언트 요청을 처리하므로 페이지를 새로고침할 때 이 식별자는 주기적으로 변경됩니다.

iOS 샘플에서 URL 스키마 업데이트

  1. Xcode에서는 PlayChat 작업 공간을 연 상태에서 PlayChat 폴더를 엽니다.

  2. GoogleService-Info.plist를 열고 REVERSED_CLIENT_ID 값을 복사합니다.

  3. Info.plist를 열고 key URL types(키 URL 유형) > Item 0 (Editor)(항목 0(편집기)) > URL Schemes(URL 스키마) > Item 0(항목 0)으로 이동합니다.

  4. 자리표시자 값 [REVERSED_CLIENT_ID]를 GoogleService-Info.plist에서 복사한 값으로 바꿉니다.

iOS 앱 실행 및 테스트

  1. Xcode에서는 PlayChat 작업 공간을 연 상태에서 Product(제품) > Run(실행)을 선택합니다.

  2. 앱이 시뮬레이터에 로드되면 Google 계정으로 로그인합니다.

    Playchat에 로그인

  3. books(도서) 채널을 선택합니다.

  4. 메시지를 입력합니다.

    메시지 보내기

이렇게 하면 Playchat 앱에서 Firebase 실시간 데이터베이스에 메시지를 저장합니다. Firebase는 데이터베이스에 저장된 데이터를 여러 기기에서 동기화합니다. Playchat을 실행하는 기기는 사용자가 books(도서) 채널을 선택하면 새 메시지를 표시합니다.

메시지 보내기

데이터 확인

Playchat 앱을 사용하여 일부 사용자 이벤트 생성한 경우 서블릿이 리스너로 등록되고 사용자 이벤트 로그를 수집하는지 확인할 수 있습니다.

앱의 Firebase 실시간 데이터베이스를 엽니다. 여기서 [FIREBASE_PROJECT_ID]Firebase 프로젝트 만들기의 식별자입니다.

https://console.firebase.google.com/project/[FIREBASE_PROJECT_ID]/database/data

Firebase 실시간 데이터베이스 하단에 있는 /inbox/ 데이터 위치 아래에는 client-가 프리픽스로 사용되고 그 뒤로 사용자의 계정 로그인을 나타내는 임의로 생성된 키가 표시되는 노드 그룹이 있습니다. 이 예의 마지막 항목인 client-1240563753 뒤로 아래의 예시 0035806813827987에서 해당 사용자의 로그 이벤트에 현재 수신 중인 서블릿의 16자리 식별자가 나옵니다.

Firebase 실시간 데이터베이스에 저장된 데이터

바로 위에 있는 /inbox/ 데이터 위치 아래에는 현재 할당된 모든 서블릿의 서블릿 식별자가 있습니다. 이 예시에서는 서블릿 하나만 로그를 수집합니다. /inbox/[SERVLET_IDENTIFIER] 아래에는 앱이 해당 서블릿에 기록한 사용자 로그가 있습니다.

https://[FIREBASE_PROJECT_ID].appspot.com/printLogs에서 백엔드 서비스의 App Engine 페이지를 엽니다. 여기서 [FIREBASE_PROJECT_ID]Firebase 프로젝트 만들기의 식별자입니다. 이 페이지에는 사용자가 생성한 사용자 이벤트가 기록된 서블릿의 식별자가 표시됩니다. 서블릿의 받은편지함 식별자 아래에 해당 이벤트의 로그 항목도 표시됩니다.

코드 탐색

Playchat iOS 앱은 Firebase 실시간 데이터베이스에 사용자 이벤트 로그를 기록하는 데 사용하는 FirebaseLogger 클래스를 정의합니다.

import Firebase

class FirebaseLogger {
  var logRef: DatabaseReference!

  init(ref: DatabaseReference!, path: String!) {
    logRef = ref.child(path)
  }

  func log(_ tag: String!, message: String!) {
    let entry: LogEntry = LogEntry(tag: tag, log: message)
    logRef.childByAutoId().setValue(entry.toDictionary())
  }
}

새 사용자가 로그인하면 Playchat은 requestLogger 함수를 호출하여 Firebase 실시간 데이터베이스의 /requestLogger/ 위치에 새 항목을 추가하고 리스너를 설정하여 Playchat이 서블릿이 해당 항목의 값을 업데이트하고 할당을 수락할 때 응답할 수 있도록 합니다.

서블릿이 값을 업데이트하면 Playchat은 리스너를 삭제하고 '로그인함' 로그를 서블릿의 수신함에 기록합니다.

func requestLogger() {
  ref.child(IBX + "/" + inbox!).removeValue()
  ref.child(IBX + "/" + inbox!)
    .observe(.value, with: { snapshot in
      print(self.inbox!)
      if snapshot.exists() {
        self.fbLog = FirebaseLogger(ref: self.ref, path: self.IBX + "/"
          + String(describing: snapshot.value!) + "/logs")
        self.ref.child(self.IBX + "/" + self.inbox!).removeAllObservers()
        self.msgViewController!.fbLog = self.fbLog
        self.fbLog!.log(self.inbox, message: "Signed in")
      }
    })
  ref.child(REQLOG).childByAutoId().setValue(inbox)
}

백엔드 서비스 측에서 서블릿 인스턴스가 시작되면 MessageProcessorServlet.javainit(ServletConfig config) 함수는 Firebase 실시간 데이터베이스에 연결하고 /inbox/ 데이터 위치에 리스너를 추가합니다.

새 항목이 /inbox/ 데이터 위치에 추가되면 서블릿은 식별자로 값을 업데이트합니다. 이는 서블릿이 해당 사용자의 로그를 처리하기 위해 할당을 수락한다는 Playchat 앱의 신호입니다. 서블릿은 Firebase 트랜잭션을 사용하여 서블릿 하나만 값을 업데이트하고 할당을 수락하도록 합니다.

/*
 * Receive a request from a client and reply back its inbox ID.
 * Using a transaction ensures that only a single servlet instance replies
 * to the client. This lets the client know to which servlet instance
 * send consecutive user event logs.
 */
firebase.child(REQLOG).addChildEventListener(new ChildEventListener() {
  public void onChildAdded(DataSnapshot snapshot, String prevKey) {
    firebase.child(IBX + "/" + snapshot.getValue()).runTransaction(new Transaction.Handler() {
      public Transaction.Result doTransaction(MutableData currentData) {
        // Only the first servlet instance writes its ID to the client inbox.
        if (currentData.getValue() == null) {
          currentData.setValue(inbox);
        }
        return Transaction.success(currentData);
      }

      public void onComplete(DatabaseError error, boolean committed, DataSnapshot snapshot) {}
    });
    firebase.child(REQLOG).removeValue();
  }
  // ...
});

서블릿이 할당을 수락하여 사용자의 이벤트 로그를 처리하면 Playchat 앱이 서블릿의 받은편지함에 새 로그 파일을 기록하는 시기를 감지하는 리스너를 추가합니다. 서블릿은 Firebase 실시간 데이터베이스에서 새 로그 데이터를 검색하여 응답합니다.

/*
 * Initialize user event logger. This is just a sample implementation to
 * demonstrate receiving updates. A production version of this app should
 * transform, filter, or load to another data store such as Google BigQuery.
 */
private void initLogger() {
  String loggerKey = IBX + "/" + inbox + "/logs";
  purger.registerBranch(loggerKey);
  firebase.child(loggerKey).addChildEventListener(new ChildEventListener() {
    public void onChildAdded(DataSnapshot snapshot, String prevKey) {
      if (snapshot.exists()) {
        LogEntry entry = snapshot.getValue(LogEntry.class);
        logs.add(entry);
      }
    }

    public void onCancelled(DatabaseError error) {
      localLog.warning(error.getDetails());
    }

    public void onChildChanged(DataSnapshot arg0, String arg1) {}

    public void onChildMoved(DataSnapshot arg0, String arg1) {}

    public void onChildRemoved(DataSnapshot arg0) {}
  });
}

삭제

이 가이드에서 사용한 리소스 비용이 Google Cloud Platform 계정에 청구되지 않도록 하는 방법은 다음과 같습니다.

Google Cloud Platform 및 Firebase 프로젝트 삭제

요금이 청구되지 않도록 하는 가장 간단한 방법은 이 가이드에서 만든 프로젝트를 삭제하는 것입니다. Firebase Console에서 프로젝트를 만들었지만 Firebase 프로젝트와 클라우드 프로젝트가 동일하므로 Cloud Console에서 프로젝트를 삭제할 수도 있습니다.

  1. Cloud Console에서 리소스 관리 페이지로 이동합니다.

    리소스 관리 페이지로 이동

  2. 프로젝트 목록에서 삭제할 프로젝트를 선택하고 삭제 를 클릭합니다.
  3. 대화상자에서 프로젝트 ID를 입력한 다음 종료를 클릭하여 프로젝트를 삭제합니다.

App Engine 앱의 기본 버전 이외의 버전 삭제

GCP 및 Firebase 프로젝트를 삭제하지 않으려면 App Engine 가변형 환경 앱의 기본 버전 이외의 버전을 삭제하여 비용을 절감할 수 있습니다.

  1. Cloud Console에서 App Engine의 Versions 페이지로 이동합니다.

    Versions 페이지로 이동

  2. 삭제할 기본이 아닌 앱 버전의 체크박스를 선택합니다.
  3. 삭제 를 클릭하여 앱 버전을 삭제합니다.

다음 단계

  • 데이터 분석 및 보관처리 — 이 샘플에서 서블릿은 로그 데이터를 메모리에만 저장합니다. 이 샘플을 확장하려면 Cloud Storage, Cloud Bigtable, Google Cloud Dataflow, BigQuery와 같은 서비스를 사용하여 서블릿이 데이터를 보관처리하고, 변환하고, 분석하도록 하면 됩니다.

  • 서블릿에 워크로드를 고르게 분산 — App Engine은 자동 및 수동 확장을 제공합니다. 자동 확장을 사용하면 가변형 환경에서 작업 부하의 변경을 감지하고 클러스터에서 VM 인스턴스를 추가하거나 삭제하여 응답합니다. 수동 확장을 사용하면 정적 인스턴스 수를 지정하여 트래픽을 처리합니다. 확장을 구성하는 방법에 대한 자세한 내용은 App Engine 문서의 서비스 확장 설정을 참조하세요.

    사용자 활동 로그가 Firebase 실시간 데이터베이스 액세스를 통해 서블릿에 할당되므로 작업 부하가 고르게 분산되지 않을 수 있습니다. 예를 들어 서블릿 한 개가 다른 서블릿보다 많은 사용자 이벤트 로그를 처리할 수 있습니다.

    각 VM에서 작업 부하를 독립적으로 제어하는 작업 부하 관리자를 구현하여 효율성을 향상시킬 수 있습니다. 이 작업 부하 분산은 초당 로깅 요청 또는 동시 실행 클라이언트 수와 같은 측정항목을 기반으로 할 수 있습니다.

  • 처리되지 않은 사용자 이벤트 로그 복구 — 이 샘플 구현에서 서블릿 인스턴스가 충돌하면 해당 인스턴스와 연결된 클라이언트 앱은 Firebase 실시간 데이터베이스의 서블릿 받은편지함으로 로그 이벤트를 계속 전송합니다. 이 앱의 프로덕션 버전에서 백엔드 서비스는 이 상황을 감지하여 처리되지 않은 사용자 이벤트 로그를 복구해야 합니다.

  • Cloud AI 제품을 사용하여 추가 기능 구현 - Cloud AI 제품과 서비스를 사용하여 ML 기반 기능을 제공하는 방법을 살펴봅니다. 예를 들어 Speech-to-Text, Translation, Text-to-Speech API 조합을 사용하여 음성 번역 기능을 제공하도록 이 샘플 구현을 확장할 수 있습니다. 자세한 내용은 Android 앱에 음성 번역 추가를 참조하세요.