Android/기타 지식

[Firebase] 내 프로젝트에 Firebase Remote Config 적용하기

jaesungLeee 2021. 9. 19. 18:06

출처 : https://firebase.google.com/docs/remote-config?hl=ko

 

개발자가 어플리케이션을 업데이트하고 나면 사용자는 사용하고 있는 어플리케이션을 업데이트시키기 위해 Google Play Store나 App Store에서 해당 어플리케이션을 업데이트하는 것이 일반적이다. 그러나, 어플리케이션의 변경 사항이 크지 않고 굳이 업데이트 내역을 게시할 필요가 없는 정도일 때를 고려해볼 필요가 있다.

Firebase Remote Config는 실제로 코드 수정이나 별도의 배포 과정 없이 어플리케이션의 내용을 빠르게 변경 가능하고 확인하게 하는 기능이다. 즉, Firebase Remote Config은 어플리케이션에서 별도의 업데이트를 하지 않아도 어플리케이션의 동작이나 모양을 변경할 수 있는 클라우드 서비스이다.

이번 포스팅은 Firebase에서 제공하는 Remote Config에 대한 포스팅이다.

 

1. Firebase Remote Config & A/B Testing

한 개발사에서 개발한 어플리케이션에 계절 별 프로모션을 제공하는 기능을 추가한다고 가정한다. 일반적으로 이러한 기능을 추가하게 되면, 어플리케이션 버전을 올리고 배포하여 사용자에게 어플리케이션을 새로 업데이트해야 한다고 공지할 것이다. 하지만, 계절 별 프로모션이 단순히 어플리케이션의 UI 레이아웃 또는 색상 테마를 변경하는 기능이라면 배포에 필요한 Resource를 불필요하게 낭비하게 된다고 여겨질 수 도 있다. 이때, Remote Config를 사용하게 되면 어플리케이션 업데이트를 게시하지 않고도 이러한 기능을 충분히 제공할 수 있게 된다.

 

그러나, Remote Config를 사용하면 어플리케이션의 변경사항을 배포 없이 빠르게 변경이 가능하지만, 다른 사용자 층에서 변경을 원하지 않는 경우도 존재할 것이다. 이때, A/B Testing을 추가할 수 있다. 이 테스트를 사용하면 서로 다른 사용자 층에게 각각 다른 구성을 제공할 수 있다. 예를 들어, 게임의 하향된 난이도를 원하는 사용자 층과 그대로 유지하기를 원하는 사용자 층이 있다면 A/B Testing를 사용하여 Needs를 동시에 반영할 수 있게 된다. A/B Testing에 대한 자세한 설명은 다른 포스트에서 다룬다.

 

1-1. 기본 원리

Remote Config에서 매개변수 갑을 가져오거나, 캐싱과 같은 중요 작업은 Client Library에서, 새 값이 활성화 되어 UX에 영향을 주는 경우에는 개발자가 직접 제어한다. 이를 통해 모든 변경 시점을 제어하여 어플리케이션에 원활한 UX를 보장할 수 있다.

아래 그림은 Firebase에서 제공하는 Remote Config의 Architecture와 사용되는 매개변수 값에 적용되는 우선순위이다.

 

 

매개변수 값에 적용되는 우선순위는 Firebase 공식 문서에서 확인할 수 있다.

https://firebase.google.com/docs/remote-config/parameters

 

원격 구성 매개변수 및 조건  |  Firebase

Google은 흑인 공동체를 위한 인종적 평등을 추구하기 위해 노력하고 있습니다. 자세히 알아보기 의견 보내기 원격 구성 매개변수 및 조건 Firebase Console 또는 원격 구성 백엔드 API를 사용할 때는

firebase.google.com

 

1-2. 정책

Firebase에서는 Remote Config를 사용할 때 참고해야할 정책을 소개한다. 

 

1. 사용자가 직접 승인해야 하는 어플리케이션 업데이트에서는 Remote Config를 사용하지 않는다. 무단으로 업데이트를 하는 경우 어플리케이션의 신뢰성 해칠 수 있다.

2. Remote Config에 사용하는 매개변수에 기밀 데이터를 저장하면 안된다. 

3. Remote Config를 사용하여 Google Play Store의 검수 요건을 우회하려고 시도하면 안 된다.

 

1-3. Remote Config Fetch 전략

Firebase Remote Config은 서버에서 값을 가져와 어플리케이션에서 활성화하는 방법과 그 시기를 원하는 대로 설정하는 기능을 제공함에 따라 어플리케이션의 구성을 시각적으로 변경하는 시기를 제어해 최종적으로는 우수한 UX를 보장할 수 있다. 이때 필요한 Remote Config Fetch 전략을 Firebase 공식 문서에서 소개하고 있다.

 

전략 1. 로드 시 가져와 활성화

어플리케이션을 처음 시작할 때 fetchAndActivate( )를 호출하여 새 값을 가져와 로드가 완료되는 즉시 활성화한다. 이 전략은 UI 모양이 크게 변경되지 않는 Remote Config에 적합하다. 그러나, 사용자가 어플리케이션을 사용하는 동안 UI가 눈에 띄게 변경될 수 있는 상황에는 적합하지 않은 전략이다.

 

전략 2. 로딩 화면 뒤에서 활성화 (가장 많이 사용되는 전략일 듯..)

전략 1에서 발생할 수 있는 UI의 잠재적 문제점을 해결할 수 있는 전략이다. Splash Screen이나 Loading Indicator와 같은 로딩 화면을 통해서 먼저 Fetch를 진행한다. 이후, 로드가 끝나면 Complete Handler에서  fetchAndActivate( )를 호출한다. 앞선 과정들이 끝나면 로딩 화면을 닫고 사용자가 상호작용할 수 있게 한다.

해당 전략을 사용하는 경우에는 로딩 화면에 시간제한을 두는 것이 좋다. 제한 시간을 두어 일정 시간이 지나면 Fetch를 아예 하지 않는 것도 고려해볼 수 있다. 사용자가 대기하는 1분의 시간조차 길게 체감될 수 있기 때문이다.

 

전략 3. 다음 시작 시 새 값 로드

어플리케이션을 처음 시작할 때 새 값을 Fetch 하지만 Activate하지는 않는다. Fetch된 새 값은 이 후에 어플리케이션을 다시 시작할 때 Activate 된다. 해당 전략의 순서이다.

 

1. 어플리케이션 시작 시 이전에 가져온 값을 Activate 한다. 로드에 필요한 시간이 없기 때문에 즉각적으로 이루어질 것이다.

2. 사용자가 어플리케이션을 사용하는 동안 비동기 호출을 시작하여 새 값을 가져온다.

3. 가져오는 단계에서의 Complete Handler에서는 아무 작업을 하지 않는다. 그대로 저장하고 있다가 어플리케이션을 다시 시작할 때 Activate 한다.

 

 

피해야 하는 전략

1. 사용자가 UI를 보고 있거나 상호작용하고 있을 때의 업데이트는 지양해야 한다.

2. 대량 요청 시 서버 자체적으로 Block 할 수 있다. 최소한으로 요청해야 한다.

 


2. 프로젝트에 적용하기

Remote Config를 사용하는 간단한 예제를 구현하였다. Remote Config를 이용한 명언 생성기 예제이다.

 

2-1. Firebase Console에 프로젝트 생성

Firebase Console에서 프로젝트를 생성한다. 프로젝트 생성과 관련된 자세한 설명은 포스팅에서 따로 설명하지 않는다. 

 

2-2. Remote Config 매개변수 값 설정

Firebase Console에서 생성한 프로젝트에서 Remote Config를 선택하여 대시보드에서 매개변수 값을 설정할 수 있다. 아래의 절차를 나타낸다.

 

1. Remote Config 대시보드 표시

프로젝트를 생성하고 나면 좌측에 위의 그림과 같이 나오는 배너가 있다. Remote Config를 클릭하여 대시보드를 연다.

 

2. Remote Config 구성 만들기

대시보드에서 구성 만들기 버튼을 클릭하여 매개변수를 만들 수 있다.

 

Key-Value 쌍으로 매개변수를 생성할 수 있으며 예시에서는 UI상에 보일 명언들로 이루어진 JSON과 텍스트 표시 유무를 원격으로 지정할 Boolean 타입을 매개변수로 생성하였다.

 

원하는 매개변수를 입력하고 저장하게 되면 아래와 같이 보일 것이다.

 

 

2-3. 의존성 정의 (build.gradle) 및 SDK 추가

아래와 같이 Gradle에 의존성을 정의한다.

 

// build.gradle(:app)

plugins {
    ...
    id 'com.google.gms.google-services'
}

dependencies {
    
    ...

    implementation platform('com.google.firebase:firebase-bom:28.4.1')
    implementation 'com.google.firebase:firebase-analytics-ktx'
    implementation 'com.google.firebase:firebase-config-ktx'
}

 

//build.gradle(:project)

buildscript {
    repositories {
        ...
    }
    dependencies {
        ...
        ...
        classpath 'com.google.gms:google-services:4.3.10'
    }
}

 

2-4. Remote Config 초기화

Remote Config의 Singleton Instance를 초기화한다. getInstance( )와 remoteConfig를 사용할 수 있다. 또한, 새 값을 가져오는 간격을 정의한다. 

 

private fun initData() {
    val remoteConfig = Firebase.remoteConfig
    remoteConfig.setConfigSettingsAsync(    // 비동기로 세팅
        remoteConfigSettings {
            minimumFetchIntervalInSeconds = 0       // Server에서 block하지 않는 한 바로바로 fetch
        }
    )
}

 

위와 같이 minimumFetchIntervalInSeconds 속성을 0초로 주게 되면 서버로부터 바로바로 fetch가 이루어진다. 가장 이상적인 방법일 수 있겠지만 0초의 성능으로는 refresh가 생각보다 잘 이루어지지는 않으며 이렇게 자주 호출하게 되면 Server에서 제제를 걸어 Remote Config 사용이 제한될 수 있다. Firebase 공식 문서에서는 이 Time interval을 3600초 즉, 1시간으로 제시하고 있다. 

 

2-5. 어플리케이션에서 사용할 매개변수 값 가져오기

Instance 초기화까지 완료하면 이제 Remote Config 객체에서 매개변수 값을 가져올 수 있다. 서버에서 설정한 값을 가져와서 Activate 하게 되면 어플리케이션에 바로 적용이 된다. 다른 경우로는 setDefaultsAsync(int)를 사용하여 Activate하지 않고 In-app 매개변수 값을 구성할 수 있다. 아래의 Method를 호출하여 매개변수 값을 가져올 수 있다.

 

1. getBoolean( )

2. getDouble( )

3. getLong( )

4. getString( )

 

2-6. 값 가져오기 및 활성화

서버에서 매개변수 값을 가져오기 위해서는 fetch( )를 호출한다. 이때, 서버에서 설정한 모든 값을 가져와 생성한 Remote Config 객체에 저장한다. 가져온 매개변수 값을 어플리케이션에서 활성화하기 위해서는 activate( )를 호출한다.반면, 호출 한 번으로 값을 가져오고 활성화 하기 위해서는 fetchAndActivate( )를 사용할 수 있다.

 

remoteConfig.fetchAndActivate()
    .addOnCompleteListener {    // fetch는 비동기적으로 이루어지기 때문에 Listener 필요
        if (it.isSuccessful) {

            progressBar.visibility = View.GONE

            val quotes = parseQuotesJson(remoteConfig.getString("quotes"))
            val isNameRevealed = remoteConfig.getBoolean("is_name_revealed")

            displayQuotesPager(quotes, isNameRevealed)
        }
    }

 

위의 예시는 생성한 remoteConfig 객체에서 fetchAndActivate( )를 호출한 다음 Listener를 달아 Activate 이후 동작을 구현하였다. 예시에서는 Activate 되기 전까지 Loading Indicator를 실행시킨다. 

7번째와 8번째 코드라인에서는 2-5에서 설명한 Method를 활용하여 값을 가져온다.

JSON 형식의 값인 경우 따로 JSON을 가져오는 Method가 없기 때문에 우선 String 형태로 가져온 뒤 JSON으로 변환 후 원하는 값을 파싱 해야 한다.

 

 


References

https://firebase.google.com/docs/remote-config?hl=ko 

 

Firebase 원격 구성

앱 업데이트를 게시하지 않고도 일일 활성 사용자 수 제한 없이 무료로 앱의 동작과 모양을 변경할 수 있습니다.

firebase.google.com

https://academy.realm.io/kr/posts/firebase-remote-config/

 

Firebase Remote Config로 배포없이 앱 운영하기

안드로이드 개발자들을 위한 수준 있는 독립 컨퍼런스인 Droid Knights에서 “Firebase Remote Config로 배포없이 앱 운영하기”이라는 주제로 강연된 세션입니다. 소개 드라마앤컴퍼니라는 회사에서 리

academy.realm.io

https://developer88.tistory.com/158

 

RemoteConfig 이용해서 다이나믹하게 앱 업데이트 하기

안드로이드 앱을 만들면서 상황에 맞게 화면을 변경시키는 것이 필요할 경우가 있습니다. 가장 쉽게 생각해 보면, 앱에 급박하게 공지를 보여주거나, 앱의 업데이트된 버전을 확인할 수 있도록

developer88.tistory.com

https://medium.com/harrythegreat/android-remote-config-%EC%9E%98-%ED%99%9C%EC%9A%A9%ED%95%98%EA%B8%B0-f8b04ef2645a

 

[Android Remote Config 잘 활용하기

파이어베이스를 쓴다면 Remote Config는 정말 빠질 수 없는기능입니다. 정말 여러모로 활용할곳이 많습니다. 앱을 강제로 업데이트 시켜주어야할때 특정 이벤트기간에만 보여주어야하는 내용이 있

medium.com