AdMob+Firebase 102 Android: 앱 업데이트 없이 앱 동작 세부 조정

1. 소개

Play 스토어에 앱을 게시한 후 앱에서 일부 매개변수의 값을 조정해야 한다고 가정해 보겠습니다. 일반적으로 개발자는 새로운 버전의 앱을 다시 게시해야 하며, 사용자도 자신의 휴대전화에서 앱을 업데이트해야 합니다.

앱에 오래 지속되는 변경사항을 커밋하려는 경우 일반적으로 앱 업데이트가 작동합니다. 그런데 앱에서 일부 매개변수의 값을 자주 조정하는 경우에는 어떻게 해야 할까요? 또는 최적의 앱 구성을 찾기 위해 몇 가지 실험을 진행하려면 어떻게 해야 할까요?

이 경우 앱 업데이트가 제대로 작동하지 않습니다. 업데이트가 사용자에게 완전히 전파되는 데 어느 정도 시간이 걸리기 때문입니다. 또한 여러 앱 버전을 대상으로 실험을 실행하기는 쉽지 않습니다.

앱의 사용자 여정이 의도한 대로 작동하는지는 어떻게 판단할 수 있을까요? Play Console의 사용자 댓글을 활용할 수 있습니다. 하지만 이 수치만으로는 명확한 결정을 내릴 수 있을 만큼 정확하지 않을 수 있습니다.

이 Codelab을 진행하는 동안 코드 버그, 문법 오류, 불명확한 문구 등의 문제가 발생하면 Codelab 왼쪽 하단에 있는 오류 신고 링크를 통해 신고해 주세요.

학습할 내용

  • Firebase용 Google 애널리틱스에서 유입경로를 만드는 방법
  • Firebase 원격 구성을 사용하는 방법
  • Firebase A/B 테스팅 실행 방법

필요한 항목

  • Android 스튜디오 버전 4.1 이상
  • Google 계정
  • Android 5.0 이상을 실행하는 테스트 기기(USB 케이블 포함) 또는 Play 스토어/Google API를 지원하는 시스템 이미지로 AVD(Android Virtual Device)를 실행하는 Android Emulator

AdMob 사용 경험 수준을 평가해 주세요.

초급 중급 고급

Firebase 사용 경험 수준을 평가해 주세요.

<ph type="x-smartling-placeholder"></ph> 초보자 중급 숙련도

2. 개발 환경 설정

코드 다운로드

다음 버튼을 클릭하면 이 Codelab의 모든 코드를 다운로드할 수 있습니다.

다운로드한 ZIP 파일의 압축을 해제합니다. 이렇게 하면 admob-firebase-codelabs-android-master라는 루트 폴더가 압축 해제됩니다.

...또는 명령줄에서 GitHub 저장소를 클론합니다.

$ git clone https://github.com/googlecodelabs/admob-firebase-codelabs-android

저장소에는 다음과 같은 4개의 폴더가 포함됩니다.

  • android_studio_folder.png기초 — 이 Codelab에서 빌드할 시작 코드입니다.
  • android_studio_folder.png101-complete_and_102-base — 이 Codelab 및 102 Codelab의 시작 조건을 정의합니다.
  • android_studio_folder.png102-complete — 102 Codelab을 위해 완료된 코드입니다.

시작 앱 가져오기

Android 스튜디오를 시작하고 시작 화면에서 'Import project'(프로젝트 가져오기)를 선택합니다. 그런 다음 다운로드한 코드에서 101-complete_and_102-base 디렉터리를 선택합니다.

이제 Android 스튜디오에서 프로젝트가 열려 있어야 합니다.

Android 프로젝트에 Firebase 구성 파일 추가

  1. Awesome Drawing Quiz 프로젝트의 개요 화면에서 설정 아이콘을 클릭합니다. <ph type="x-smartling-placeholder">9bacb5ada7cbaaf6.png</ph>
  2. 일반 탭에서 Android 앱을 선택하여 google-service.json 파일을 다운로드합니다.
  3. 구성 파일을 프로젝트의 android_studio_folder.pngapp 디렉터리로 이동합니다. 797cde1881a38fdf.png

3. Console에서 Firebase 프로젝트 열기

다음 단계로 이동하기 전에 AdMob+Firebase 101 Codelab'Firebase 프로젝트 설정' 단계에서 만든 Firebase Console에서 프로젝트를 엽니다.

e0a028059c9e00cb.png

4. 앱 이벤트의 유입경로 만들기

앱 내부의 사용자 활동을 추적하기 위해 몇 가지 앱 이벤트를 추가했을 수 있습니다. 각 앱 이벤트의 보고서를 읽고 총 횟수, 사용자당 평균 수, 인구통계 등 이벤트와 관련된 세부정보를 확인할 수 있습니다.

하지만 특정 이벤트에 집중하는 대신 일련의 이벤트의 완료율을 확인하려면 어떻게 해야 할까요? Firebase용 Google 애널리틱스에서는 유입경로를 사용하여 일련의 앱 이벤트의 완료율을 시각화하고 최적화할 수 있습니다.

유입경로 만들기

유입경로를 만들려면 다음 절차를 따르세요.

  1. Firebase Console로 이동하여 앞에서 만든 Awesome Drawing Quiz 프로젝트를 선택합니다.
  2. 유입경로를 클릭합니다.
  3. 새 유입경로를 클릭합니다.
  4. 유입경로의 이름과 설명을 입력합니다.
  5. 유입경로의 단계로 사용할 처음 두 이벤트를 선택합니다.
  6. 단계를 추가할 때마다 다른 이벤트 추가를 클릭하고 이벤트를 선택합니다.
  7. 만들기를 클릭합니다.

위 단계에 따라 다음 유입경로를 만듭니다.

1순위 유입경로 이름: 수준 성공률 이벤트: level_start, level_successd3bc78ef61a261d7.png

2번 유입경로 이름: 보상형 광고 완료율 이벤트: ad_reward_prompt, ad_reward_impression, ad_reward45c9542DFA663014.png

#3 유입경로 이름: 게임 완료율 이벤트: game_start, game_completedab25e8501746d5f.png

유입경로 분석 보기

유입경로를 만들고 나면 Firebase Console의 유입경로 메뉴에서 액세스할 수 있습니다. 목록에서 유입경로 이름을 클릭하면 각 유입경로에 대한 자세한 분석 내용을 확인할 수 있습니다.

620c0e84587c8ad4.png

예를 들어 레벨 성공률을 클릭합니다. 다음과 같은 유입경로 세부정보가 표시됩니다.

c889f9b6ece15847.png

위의 스크린샷에서 레벨을 시작한 (level_start 이벤트를 트리거한) 레벨을 통과한 (level_success 이벤트를 트리거한) 사용자의 비율을 확인할 수 있습니다. 여기에서 46.2% 의 사용자가 레벨을 완료했음을 알 수 있습니다.

이벤트 수를 클릭하면 다음과 같이 이벤트 수에 따라 측정항목이 표시됩니다.

d044fb7b07e6e0d9.png

위 스크린샷의 측정항목에 따르면 해당 기간 동안 116회의 시도 (level_start 이벤트가 트리거됨)와 57회의 클리어 (level_success 이벤트가 트리거됨)가 있었습니다.

이벤트를 기반으로 한 완료율(49.1%)이 사용자 기준 완료율(46.2%)보다 약간 높으므로 다른 사람보다 실적이 좋은 사람이 몇 명 있다고 말할 수 있습니다.

5. 앱에 원격 구성 통합

앱 이벤트 및 유입경로를 기반으로 앱에 대한 정보를 얻을 수 있으므로 앱을 최적화하는 것이 좋습니다. 일반적으로 앱에서 매개변수 값을 미세 조정하는 작업이 포함됩니다. 이러한 매개변수의 값을 수정하려면 변경사항을 사용자에게 적용할 수 있도록 앱을 업데이트해야 합니다.

Firebase의 원격 구성을 사용하면 앱 업데이트 없이 해당 값을 조정할 수 있습니다. 즉, 사용자가 업데이트를 다운로드하도록 강제하는 방식으로 사용자를 방해하지 않고도 앱 동작을 변경할 수 있습니다.

이 Codelab에서는 원격 구성을 사용하여 앱을 업데이트하지 않고도 리워드 수량 (보상형 동영상 광고를 시청한 후 공개할 글자 수)을 조정할 수 있도록 하는 방법을 알아봅니다.

앱 종속 항목에 원격 구성 추가

먼저 앱 종속 항목에 Firebase 원격 구성을 추가해 보겠습니다.

app/build.gradle

apply plugin: 'com.android.application'

android {
    ...
}

dependencies {
    ...

    // TODO: Add Firebase Remote Config dependency (102)
    implementation 'com.google.firebase:firebase-config-ktx'

    ...
}

...

gradle 파일로 프로젝트 동기화

앱에서 모든 종속 항목을 사용할 수 있도록 하려면 프로젝트를 Gradle 파일로 동기화합니다. 파일 > Sync Project with Gradle Files 메뉴를 사용하여 프로젝트를 gradle 파일과 동기화합니다.

원격 구성 매개변수의 기본값 설정

원격 구성에서 값을 가져오려면 네트워크 연결이 필요합니다. 네트워크를 사용할 수 없는 경우 각 원격 구성 매개변수의 기본값을 정의해야 합니다.

res/xml 폴더에 remote_config_defaults.xml 파일을 만듭니다. 그런 다음 리워드 금액의 기본값을 설정합니다 (reward_amount)

res/xml/remote_config_defaults.xml

<?xml version="1.0" encoding="utf-8"?>
<defaultsMap>
    <entry>
        <key>reward_amount</key>
        <value>1</value>
    </entry>
</defaultsMap>

reward_amount은 원격 구성의 매개변수 이름입니다.

원격 구성에서 보상 금액을 가져옵니다.

AwesomeDrawingQuiz.kt를 수정하여 GameSettings 클래스가 RemoteConfig 인스턴스 참조를 보유하도록 합니다.

RemoteConfig 인스턴스는 개발 프로세스에 도움이 되도록 디버그 모드에서 서버에서 최신 값을 가져오도록 구성됩니다. (fetch(0L)를 호출하여 가져오기 간격 최솟값을 0초로 설정)

AwesomeDrawingQuiz.kt

class AwesomeDrawingQuiz : Application() {

    ...

    // COMPLETE: Provide FirebaseRemoteConfig instance (102)
    private fun provideGameSettings() = GameSettings(provideRemoteConfig())

    // COMPLETE: Add a function that provides a FirebaseRemoteConfig instance (102)
    private fun provideRemoteConfig(): FirebaseRemoteConfig {
        val rc = Firebase.remoteConfig.apply {
            setDefaultsAsync(R.xml.remote_config_defaults)
        }
        val fetchTask = if (BuildConfig.DEBUG) rc.fetch(0L) else rc.fetch()
        fetchTask.addOnCompleteListener {
            if (it.isSuccessful) {
                Log.d("AwesomeDrawingQuiz", "Remote config value fetched")
                rc.activate()
            }
        }
        return rc
    }
}

그런 다음 GameSettings 클래스를 변경하여 원격 구성에서 보상 금액을 가져옵니다.

GameSettings.kt

// TODO: Add FirebaseRemoteConfig as a class member
class GameSettings(private val rc: FirebaseRemoteConfig) {

  ...

  // TODO: Apply reward amount from the Remote Config (102)
  val rewardAmount: Int
    get() = rc.getLong(KEY_REWARD_AMOUNT).toInt()

  companion object {
    ...

    // TODO: Add a key for 'reward_amount' Remote Config parameter (102)
    private const val KEY_REWARD_AMOUNT = "reward_amount"
  }
}

콘솔에서 원격 구성 매개변수 만들기

다음으로 보상 수량에 대한 새로운 원격 구성 매개변수를 만들어 즉석에서 값을 조정할 수 있습니다.

새 매개변수를 만들려면 Firebase Console로 이동한 후 앞서 만든 Awesome Drawing Quiz 프로젝트를 선택합니다. 원격 구성 -> 첫 번째 매개변수 추가 버튼을 클릭합니다.

7f52617141c53726.png

매개변수 이름을 reward_amount로 지정하고 기본값을 1로 설정합니다. 그런 다음 매개변수 추가 버튼을 클릭합니다.

cbc771fd1685b29c.png

변경사항 게시 버튼을 클릭하여 변경사항을 사용자에게 적용합니다.

d6a6aa4a60e06ee9.png

6. 원격 구성으로 앱 동작 변경

이제 앱 코드를 업데이트하지 않고도 Firebase Console에서 Awesome Drawing Quiz의 보상 금액을 구성할 수 있습니다.

이 섹션에서는 보상형 광고를 시청한 후 앱에서 힌트로 2명의 캐릭터가 표시되도록 리워드 금액을 1에서 2로 변경합니다.

Reward_amount 매개변수의 기본값 업데이트

Firebase Console로 이동하여 앞서 만든 Awesome Drawing Quiz 프로젝트를 선택합니다. 원격 구성을 클릭하고 목록에서 reward_amount를 클릭합니다. 그런 다음 기본값을 2로 변경하고 Update 버튼을 클릭합니다.

9a9bd8a26a39bfe3.png

변경사항 게시 버튼을 클릭하여 변경사항을 사용자에게 적용합니다.

d6a6aa4a60e06ee9.png

앱 동작 변경사항 확인

앱 동작 변경사항을 확인하려면 프로젝트를 다시 실행하세요. 보상형 광고 시청을 마치면 원격 구성 콘솔에서 구성한 대로 앱에 보상으로 두 글자가 표시됩니다.

보상형 광고를 시청하기 전

리워드로 추가된 두 글자가 표시됨

7. 보상 금액을 최적화하는 실험을 만듭니다.

이제 앱 업데이트를 게시하지 않고도 리워드 금액을 변경할 수 있습니다. 하지만 변경한 금액이 앱에 적합한지 어떻게 판단할 수 있나요?

Firebase A/B 테스팅을 사용하면 앱을 업데이트하거나 각 실험을 실행하고 실적을 추적하는 별도의 도구를 빌드하지 않고도 실험을 실행하여 앱의 전반적인 사용자 환경을 최적화할 수 있습니다.

실험 설계

새 실험을 만들기 전에 실험의 목표를 명확히 설정해야 합니다. 새 실험을 만들기 전에 다음 체크리스트를 검토하세요.

  • 내용: 무엇을 최적화하고 싶으신가요? (예: 게임 난이도, 광고 타이밍/가시성 등)
  • 이유: 실험을 실행하는 비즈니스 목표가 무엇인가요? (예: 광고 수익 극대화, 유지율 향상 등)
  • 대상: 실험에 참여할 사람은 누구인가요? (예: 모든 사용자, 특정 사용자 잠재고객 등)?

이 Codelab에서는 보상 수량 값을 최적화하여 Awesome Drawing Quiz의 일일 사용자 참여도를 극대화하는 실험을 만듭니다.

실험 만들기

Firebase Console에서 Awesome Drawing Quiz 프로젝트를 엽니다. A/B 테스팅 메뉴를 선택한 후 실험 만들기 버튼을 클릭합니다.

원격 구성을 선택하여 원격 구성 실험을 만듭니다.

f38a85328ab54e7e.png

다음 스크린샷과 같이 실험 이름을 '리워드 금액'으로 지정합니다.

15d552adb61c0b08.png

타겟팅 옵션을 구성합니다. 이 Codelab에서는 Awesome Drawing Quiz의 사용자 100% 를 타겟팅합니다.

61b316741a63050f.png

실험의 주요 목표가 일일 사용자 참여도를 최대화하는 최적의 값을 찾는 것이므로 추적할 기본 측정항목으로 일일 사용자 참여도를 선택합니다.

694641b57d90ff65.png

마지막으로 대조군과 대안 그룹을 설정하여 실적이 더 우수한 그룹을 파악합니다. 통제 그룹에서 reward_amount을(를) 선택하고 해당 값은 변경하지 않고 그대로 둡니다. 대안 그룹의 이름을 '적은 리워드'로 지정한 다음 reward_amount 값을 1로 변경합니다.

10ed7f5b06858519.png

이 설정을 사용하면 '리워드가 적은' 그룹에 속한 사용자에게는 한 글자의 리워드가, 통제 그룹의 사용자에게는 두 글자가 리워드로 제공됩니다. 결과적으로 리워드 금액이 사용자에게 미치는 영향을 확인하게 됩니다.

검토 버튼을 클릭하면 다음과 같이 실험 개요가 표시됩니다.

ae6477ce79f6265d.png

실험 실행

실험 시작 버튼을 클릭하여 실험을 실행합니다. 실험 구성이 시작된 후에는 변경할 수 없습니다.

7131bf9b4fa74fa5.png

8. 실험 관리

실험 진행 상황 보기

Firebase Console의 A/B 테스팅 메뉴에서 다음 스크린샷과 같이 실험 진행 상황을 확인할 수 있습니다. 카드에서 지난 30분 동안 실험에 참여한 사용자 수도 확인할 수 있습니다.

8a7009bdd8871d95.png

목록에서 실험을 클릭하면 실험 세부정보를 볼 수 있습니다. 실험에서 실적이 가장 우수한 대안이 판명될 때까지 '주요 변수를 선언하기에는 너무 이릅니다.'라는 메시지가 표시됩니다.

a4e7ca3e3f4711cd.png

실험을 한동안 실행하고 나면 실험 중에 수집된 데이터가 개선사항 개요 섹션에 표시되기 시작합니다. 각 대안의 실적을 비교하여 어느 대안의 실적이 더 우수한지 확인할 수 있습니다. 다음 스크린샷은 개선 개요 섹션의 예를 보여줍니다.

e2d00fc27c053fd3.png

개선사항 개요 섹션 아래의 표에서 실험의 목표 측정항목 세부정보와 실험에서 추적 중인 추가 측정항목을 확인할 수 있습니다. 다음 스크린샷은 측정항목 세부정보 섹션의 예를 보여줍니다.

c3859d642f85cc52.png

모든 사용자에게 리더 적용

실험이 오랫동안 진행되어 가장 우수한 대안이 판명되면 전체 사용자에게 실험을 적용할 수 있습니다. A/B 테스팅에서 명확한 최우수 대안이 확인되면 모든 사용자에게 최우수 대안을 적용하도록 권장합니다.

86cb6a6c07516634.png

하지만 실험에서 명확한 주요 변수가 확정되지 않은 경우에도 모든 사용자에게 대안을 출시할 수 있습니다.

실험 세부정보 화면에서 컨텍스트 메뉴 ( 73afe611adf58774.png)를 클릭한 다음 대안 적용을 클릭합니다.

374e1c72be1d0656.png

모든 사용자에게 적용할 대안을 선택한 다음 원격 구성에서 검토 버튼을 클릭하여 원격 구성을 변경하기 전에 변경사항을 검토합니다.

e176f6e6a72c754.png

초안에 문제가 없음을 확인한 후 변경사항 게시 버튼을 클릭하여 변경사항을 모든 사용자에게 적용합니다.

d65d545620ce93f6.png

9. 완료

AdMob+Firebase 102 Android Codelab을 완료했습니다. 이 Codelab의 완료 코드는 android_studio_folder.png102-complete 폴더에서 확인할 수 있습니다.