Firebase Remote Config(파이어베이스 원격 구성) 구현하기
Android/Firebase

Firebase Remote Config(파이어베이스 원격 구성) 구현하기

728x90
반응형

 

기본적인 서버-클라이언트 관점에서 데이터 변경을 살펴보면

클라이언트는 서버에 값(변경됬을지도 모를)을 요청하고, 

서버는 해당 값을 보내주고,

다시 클라이언트는 서버가 보내준 데이터를 받아 변경해주는 순서로 데이터가 업데이트 됩니다.

 

이 과정중 클라이언트의 요청에대한 서버가 보낼 값들이 변경되는 경우가 있습니다.

예를들어 매인광고 화면, 문구, 등등이 있습니다.

보통의 경우 관리자 페이지를 따로두어 현업(마케팅, 영업, 등등)부서에서는 클라이언트에 보낼 서버의 정보들을 변경하게됩니다. 

 

 

 

여기서 Firebase remote config의 장점은 관리자 페이지를 따로 구현할 필요없이 파이어베이스가 콘솔을 통해 이 기능을 대신해준다는점에 있습니다.

 

 

Firebase 공식 문서에 정의하는 주요 기능(장점)은

첫째, 사용자가 앱스토어에서 업데이트 하지 않아도 앱의 동작과 모양을 변경할 수 있는 클라우스 서비스입니다.

예를들어 앱의 업데이트를 게시하지 않아도 레이이웃 또는 색상 테마를 변경하여 계절별 프로모션을 지원할 수 있습니다.

둘째, 특정 사용자층(앱버전, 언어, GA 잠재고객, 세그먼트)별 다양한 사용자 환경을 제공할 수 있습니다. 

셋째, Remote Config의 백분위수 타겟팅 기능과 GA와 함께 사용하여 A/B 테스트를 실행할 수 있습니다. 사용자층을 나눈 세그먼트 별로 개선사항을 검증한 후 전체 사용자 층에 적용할 수 있습니다.  

 

 

 

1)변경에 대한 요구사항이 개발쪽이 아닌 현업(마케팅부서, 영업부서 등등)에서 일어나고,

그 2)변경사항이 자주 일어나는 경우,

그리고 3) 특정 고객 그룹에 따라 다르게 데이터를 변경해야 할 경우

remote config 기능을 사용하면 유용할것 같다는 생각을 했습니다.

 

이런 생각을 바탕으로 3가지 기능을 추가하기로 했습니다. 

 

첫째, 로그인 아이디를 잃어버린 경우, 연락해야하는 담당자의 번호를 나타내는 부분입니다. 

이 경우 사용자층에 따라서 다른 환경을 적용할수있다는 remote config 기능까지 더해져 더욱 유용할것이라는 생각이 들었습니다.

 

둘째, 개발서버와 운영서버의 ip 주소를 바꿔줄때입니다. 물론 디버그모드와 릴리즈모드에 따라 운영서버/개발서버가 따로 셋팅되어있습니다. 하지만 영업팀에서 아직 릴리즈되지 않는 기능들을 시연할경우 등 종종 이 기능이 필요할 경우가 있었습니다. 그때마다 개발팀에 요청해야했는데 이번 기회에 이 기능을 추가하기로 했습니다.

 

셋째, 앱이 맨처음 실행되었을때 나오는 광고문구 및 이미지에 대한 교체에 이 기능을 추가하기로했습니다.

사실 큰 회사에서는 어드민페이지에서 이러한 기능들이 되어져 있지만 그러한 여력이 되지 않는 경우, remote config를 통해 간편하게 구현할 수 있을것 같다고 생각했습니다. 특히 특정 시간에만 노출되도독 하는 기능도 매우 유용하다고 생각했습니다. 

 

 


 

1. 콘솔에서 받은 파라미터들을 어디언제 저장할것인가?

 저의 경우,  로딩시, SharedPreferences에 저장하기로했습니다.

언제 저장할지에 대한 내용은 (firebase.google.com/docs/remote-config/loading)를 참고하여 정했습니다. 

 

1. SharedPreferencesHelper 클래스 만들기

public class SharedPreferencesHelper {
    private static SharedPreferences prefs;
    private static SharedPreferences.Editor prefsEditor;

    // 외부에 제공할 자기 자신의 인스턴스
    private static SharedPreferencesHelper instance;

    private SharedPreferencesHelper(Context context) {
        /* SharedPreferences 핸들러 얻기: FILE_NAME 이라는 저장도를 생성하고, 생성한 application 내에서만 사용가능한 모드로 설정(MODE_PRIVATE)*/
        prefs = context.getSharedPreferences(FILE_NAME, MODE_PRIVATE);
        prefsEditor = prefs.edit();
    }

    // 인스턴스를 만드는 메서드에 동기화(임계구역) : Thread-Safe Initialization
    public static synchronized SharedPreferencesHelper getInstance(Context context){
        if(instance == null)
            instance = new SharedPreferencesHelper(context);
        return instance;
    }

    public static void write(String key, String value) {
        prefsEditor.putString(key, value);
        prefsEditor.apply(); // commit 호출시 동기 처리, apply 호출시 비동기 처리
    }

    public static String read(String key, String defValue) {
        return prefs.getString(key, defValue);
    }

}

* SharedPreferences 참고* 

더보기

SharedPreferences는 초기 설정 값이나 자동 로그인 여부 등 간단한 값을 저장할 때 DB를 사용하면 복잡하기 때문에 SharedPreferences를 사용하면 적합하다. SharedPreferences는 어플리케이션에 파일 형태로 데이터를 저장하고, 데이터는 (key, value) 형태로 data/data/패키지명/shared_prefs 폴더 안에 xml 파일로 저장된다. 또한, 해당 파일은 어플리케이션이 삭제되기 전까지 보존된다. SharedPreferences는 앱의 어디서든 전역적으로 사용하기 때문에 "Singleton pattern"을 사용해서 어디서든 접근 가능하게 만드는 것이 좋다.

 

이제 Backend side(파이어베이스 콘솔)에서 원하는 값을 가져오는 부분을 구현합니다.

저는 로딩 Activity에 구현하였습니다.

 

2. 원격 구성 싱글턴 개체 가져온 후 설정 셋팅

mFirebaseRemoteConfig = FirebaseRemoteConfig.getInstance();

FirebaseRemoteConfigSettings configSettings = new FirebaseRemoteConfigSettings
					.Builder()
                                        .setMinimumFetchIntervalInSeconds(3600).build();
                                        
/* 서버에서 구성 가져 오기는 일반적으로 시간당 5 개의 요청으로 제한되기때문에 
개발자할때는 아래와같이 개발자 모드로 개발해야 시간당 더 많은 요청을 수행할 수 있게됨
FirebaseRemoteConfigSettings configDEBUGModeSettings = new FirebaseRemoteConfigSettings
					.Builder()
                                        .setDeveloperModeEnabled(BuildConfig.DEBUG).build();*/
                                        
mFirebaseRemoteConfig.setConfigSettingsAsync(configSettings);

3. 기본 매개변수값 설정( xml리소스파일 또는 Map 객체 사용)

기본 원격 구성 값을 설정합니다. 일반적으로 나중에 원격 구성을 사용하여 구성 할 수있는 모든 값에 대해 앱 기본값이 있어야합니다. 콘솔에서 변경사항을 주지 않았을때는 다음의 기본값을 사용하고, 기본값을 조정해야 할 때 App Manager 콘솔에서 업데이트 된 값을 설정하는 것입니다. 그런 다음 다음에 애플리케이션이 서버에서 가져올 때 업데이트 된 값이 사용됩니다

mFirebaseRemoteConfig.setDefaultsAsync(R.xml.remote_config_defaults);

remote_config_defaults.xml 

<?xml version="1.0" encoding="utf-8"?>
<!-- START xml_defaults -->
<defaultsMap>
    <entry>
        <key>title</key>
        <value>기본으로 설정한 제목입니다.</value>
    </entry>
    <entry>
        <key>contents</key>
        <value>기본으로 설정한 내용입니다.</value>
    </entry>
</defaultsMap>

여기서 수행 한 것처럼 xml 파일을 통해 기본값을 설정하거나 다른 setDefaults 메소드 중 하나를 사용하여 인라인으로 기본값을 설정할 수 있습니다.

 

4. 원격 구성에서 새 값을 가져와 로드가 완료되는 즉시 SharedPreferences 에 저장하도록 구현

mFirebaseRemoteConfig.fetchAndActivate()
	.addOnCompleteListener(this, new OnCompleteListener<Boolean>() {
		@Override
		public void onComplete(@NonNull Task<Boolean> task) {
			if (task.isSuccessful()) {
				sharedPrefsHelper.write("title", mFirebaseRemoteConfig.getString("fb_title"));
				sharedPrefsHelper.write("contents", mFirebaseRemoteConfig.getString("fb_contents"));
			}
		}
	});

 

그럼 SharedPreferences에 어떤값이 저장되었는지 확인해보겠습니다. 

 


아직 파이어베이스 콘솔창에서 아무값도 업데이트 하지 않았기때문에 

remote_config_defaults.xml 에 default 로 설정되어있는 값으로 셋팅된것을 확인할수 있습니다.

 

 

그럼 이제 콘솔창에서 파라미터들을 설정해주겠습니다. 

 

업데이트 해주고 싶은 내용들을 키값에 맞춰 작성해줍니다.

그리고  "변경사항 게시" 버튼을 눌러주시면 끝~

(알림창으로 바로 적용된다고 나왔지만 저를 포함한 다른분들도 바로 적용되지 않은경우가 많았습니다)

조금 기다렸다가

 

 

앱을 다시 "설치하지 않고", 다시 재실행시켜줍니다

(저의 경우 로딩화면에 값을 받아오는 코드를 작성했기때문에..)

그리고  SharedPreferences 파일을 확인해보니 콘솔에서 설정한 값으로 변경된 것을 확인하였습니다. 

 


 

 

 광고문구 및 이미지에 대한 교체

 

 

 

 

 

 

참고
firebase.google.com/docs/remote-config

 

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

 

 

 

 

728x90
반응형