Flutter Application/기초 사용법

안드로이드 Firebase Cloud Functions 연동하기

sdchjjj 2025. 1. 3. 11:42
반응형

안녕하세요.

 

이번 포스팅에서는 안드로이드 앱과 firebase cloud functions를 연동하여 간단한 동작을 구현해 보겠습니다.

 

언어: kotlin

sdk vsersion

  - compile: 33

  - min: 24

  - target: 33

 

파이어베이스 프로젝트는 지난 포스팅에서 사용했던 것을 그대로 써보겠습니다.

프로젝트 등록 및 연동은 아래 포스팅을 참고해 주세요.

https://it-of-fortune.tistory.com/40

 

안드로이드 Firebase Cloud Firestore database 생성, 연동, 사용법

안녕하세요. 이번 포스팅에서는 안드로이드 스튜디오 프로젝트에 파이어스토어 데이터베이스를 연결하고, 간단하게 사용해 보겠습니다. 언어: 코틀린 sdk vsersion - compile: 33 - min: 21 - target: 33 - Fir

it-of-fortune.tistory.com

 

프로젝트 생성과 연동이 완료되었다는 가정 하에 시작하겠습니다.

 

먼저 생성된 프로젝트에서 Functions를 추가합니다(figure 1 참조).

figure 1

그리고 functions를 사용하기 위해서는 firebase Blaze 요금제를 사용해야 합니다.

 

사용한 만큼 지불이기 때문에 테스트 용으로 조금 사용하는 것으로는 비용이 발생하지 않습니다.

 

좌측 하단의 버튼으로 요금제를 업그레이드 합니다(figure 2 참조).

figure 2

요금제 업그레이드에 대한 설명은 따로 하지 않겠습니다.

 

이후 안드로이드 스튜디오로 돌아와 terminal에서 명령어를 입력해 줍니다.

firebase init

*만약 firebase login이 되어있지 않은 상태라면 firebase login을 먼저 입력하고 login을 진행해 줍니다.

firebase login

 

그 후 functions를 골라 선택해 줍니다(figure 3 참조).

방향키로 이동하고 스페이스바로 선택, 엔터를 눌러 넘어갑니다.

figure 3

 

그 다음 "Use an existing project"를 선택하고, 내 파이어베이스 프로젝트를 선택합니다.

 

이후 저는 JavaScript, N, Y를 차례대로 선택했습니다(figure 4, 5, 6 참조).

figure 4
figure 5
figure 6

아무것도 입력하지 않고 엔터를 누르면 default 값이 선택됩니다(선택지 중 대문자가 default).

 

마지막으로 package가 다운로드되며 설정이 완료됩니다(figure 7 참조).

figure 7

 

Firebase 설정을 하겠습니다. 아래와 같이 추가해 줍니다.

project/build.gradle

buildscript {
    dependencies {
        classpath("com.google.gms:google-services:4.3.15")
    }
}

 

dependancy를 추가합니다.

app/build.gradle

plugins {
    ...
    ...
    id ("com.google.gms.google-services") // Google Services Plugin 추가
}
implementation("com.google.firebase:firebase-bom:33.7.0")
implementation("com.google.firebase:firebase-functions-ktx:21.1.0")

 

gradle sync를 진행해 주면 firebase functions 사용 준비가 완료됩니다.

 

이제 실제 functions를 구현해 보겠습니다.

 

프로젝트 폴더 내에 functions/index.js 파일에서 동작을 구현합니다.

functions/index.js

const functions = require('firebase-functions');

exports.helloWorld = functions.https.onCall((request, context) => {
  // data 객체를 로그로 출력
  console.log("Received data:", request.data);

  // name 필드 추출
  const name = request.data.name || 'Anonymous';

  // 응답 반환
  return { message: `Hello, ${name}!` };
});

 

그리고 터미널에서 명령어를 입력해 해당 function을 파이어베이스에 배포해 줍니다.

firebase deploy --only functions

다소 시간이 걸릴 수 있습니다.

 

배포를 마치면 콘솔에서 해당 function을 확인할 수 있습니다(figure 8 참조).

figure 8

 

이제 클라우드 함수를 호출하는 코드를 짜보겠습니다.
activity_main.xml

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp">

    <EditText
        android:id="@+id/inputName"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Enter your name" />

    <Button
        android:id="@+id/btnSubmit"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Submit" />

    <TextView
        android:id="@+id/outputMessage"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text=""
        android:textSize="16sp"
        android:paddingTop="16dp" />
</LinearLayout>

 

MainActivity.kt

package com.contents.laboratory
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import com.google.firebase.FirebaseApp
import com.google.firebase.functions.FirebaseFunctions

class MainActivity : AppCompatActivity() {
    private lateinit var functions: FirebaseFunctions

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        FirebaseApp.initializeApp(this) // Firebase 초기화
        functions = FirebaseFunctions.getInstance() // Firebase Functions 인스턴스

        setContentView(R.layout.activity_main)

        val inputName = findViewById<EditText>(R.id.inputName)
        val btnSubmit = findViewById<Button>(R.id.btnSubmit)
        val outputMessage = findViewById<TextView>(R.id.outputMessage)

        btnSubmit.setOnClickListener {
            val name = inputName.text.toString()
            callHelloWorldFunction(name) { message ->
                outputMessage.text = message
            }
        }
    }

    // could functions 호출
    private fun callHelloWorldFunction(name: String, onComplete: (String) -> Unit) {
        val data = hashMapOf("name" to name)

        FirebaseFunctions.getInstance()
            .getHttpsCallable("helloWorld")
            .call(data)
            .addOnSuccessListener { result ->
                val message = (result.getData() as? Map<*, *>)?.get("message") as String
                onComplete(message)
            }
            .addOnFailureListener { exception ->
                println("Error: ${exception.message}")
            }
    }
}

 

텍스트를 입력하고 버튼을 클릭하면 클라우드 함수를 호출하고, 가공된 데이터를 응답으로 받아 화면에 표기해 주는 간단한 동작입니다.

 

테스트를 해보겠습니다.

figure 9 - result

정상적으로 동작합니다.

 

번외 - firebase cloud functions console log 확인하기

 

index.js 파일 내에 콘솔 로그를 찍어주는 코드를 추가했습니다.

해당 코드가 찍어주는 로그 화면은 firebase project console 창에서 진입이 가능합니다.

  1. functions 진입

  2. ... 클릭

  3. 로그 보기 클릭
위 순서대로 진행하여 로그 탐색기로 이동합니다(figure 10 참조).

figure 10

 

이곳에서 우리가 추가한 로그를 포함해 에러 로그 등 functions와 관련된 로그를 확인할 수 있습니다(figure 11 참조).

figure 11

 

이상 포스팅을 마치겠습니다.

 

감사합니다.

728x90
반응형