안드로이드 앱을 만들면서 상황에 맞게 화면을 변경시키는 것이 필요할 경우가 있습니다.

가장 쉽게 생각해 보면, 앱에 급박하게 공지를 보여주거나,

앱의 업데이트된 버전을 확인할 수 있도록 하는 것인데요.

RemoteConfig을 이용하면 이러한 일들을 쉽게 할 수 있습니다.


오늘은 RemoteConfig을 이용하는 방법에 대해서 정리해 보겠습니다.


1. RemoteConfig


앱을 다운로드 할 필요없이 앱의 형태와 동작을 변경할 수 있도록,

구글에서 제공해주는 클라우드 서비스의 형태로 Firebase서비스의 일부인 RemoteConfig입니다.


공식문서에 소개된 이 API의 Architecture는 아래와 같이 구성되어 있습니다.

아직은 무슨 말인지 모를 수 있으니, 휙 둘러보고, 아래글을 다 읽은 다음 다시 올라와서 보면 좀 더 이해가 될 수 있을 것 같네요.



이렇게 설계된 RemoteConfig은 다음과 같은 스텝을 밟아서 사용을 해야 하는데요.


1. Firebase설치하기

2. RemoteConfig singleton객체 가져오기 ( FirebaseRemoteConfig.getInstance() 메소드 사용)

3. in-app default parameter설정하기(set)

4. parameter값 가져오기

5. 서버에서 parameter값 변경하고(set), 그 값을 fetch and activate해서 반영하기


그럼 이제 실제로 Firebase를 설치하고 위의 순서대로 값을 받아오겠습니다.



2. Firebase 설치


모든 서비스가 그렇지만, 제일먼저 library를 가져와야 하는데요.

app레벨의 build.gradle에서 아래의 코드를 적어줍니다.


implementation 'com.google.firebase:firebase-config:16.4.0'


이제 웹의 Firebase의 console에서 설정을 해 주어야 하는데요.

(이 글에서는 Firebase 를 사용하는 방법에 대한 부분은 생략하겠습니다.)

Firebase의 console에서 좌측 Navigation메뉴중 아랫부분에 보면,

성장 > RemoteConfig이 있는데요. 

이 메뉴를 눌러주면 아래와 같은 화면을 볼 수 있습니다.



위 화면만 보면 무언가 너무 쉬운 느낌이 드는데요.

key, value값만 정의하면 되므로, 비개발자의 경우도 어렵지 않게 수정을 할 수 있겠네요.


test_message와 has_test_message의 key값을 가진 매개변수를 추가해 보도록 하겠습니다



이제 Firebase에서 key-value형태의 json값을 추가하였으므로,

앱에서 읽어오는 것을 해야 하겠습니다.


3. 앱에서 RemoteConfig값 읽어오기


RemoteConfig의 Singleton객체 얻어오기 위해서 getInstance메소드를 사용합니다.

아래의 setDeveloperModeEnabled는 개발자 모드로 설정하기 위한 메소드 입니다.

RemoteConfig을 사용하면서 주의해야 할 점은, 1시간에 5회이상 fetch할수 없다는 점입니다.

다만 테스트 하기에는 문제가 될 있으므로, 이러한 제한을 풀어주는 옵션이 setDeveloperModeEnabled입니다.




저 객체를 이용해서 Firebase클라우드 서버에서 값을 얻어오기 전에, 

잊지 말아야 할 것이 있습니다.

값을 읽어오기 전에 항상 default값을 설정해 놓아야 한다는 것인데요.

res폴더에 remote_config_default.xml과 같은 파일이름으로 디폴트 값들을 미리 설정해 놓구요.



위에서 설정한 값들을 setDefaults메소드를 이용해서 set해주면 됩니다.



이제 값을 읽어올(fetch) 준비가 되었습니다.

fetch메소드로 구글클라우드에서 값을 읽어온 후 콜백방식으로 성공한 경우 activateFetched메소드를 사용해서 읽어온 값을 사용할 수 있도록 합니다.


fetch할 때 cacheExpiration에 대해서는 주의를 할 필요가 있는데요.

1시간당 특정회수 이상 fetch를 할 경우 FirebaseRemoteConfigFetchThrottledException이 나게 되어 있기 때문입니다.

이는 무료인 firebase의 remoteConfig서버에 부하를 줄이기 위해서 인데요.

default값은 무려 12시간으로 되어 있습니다.

아래 코드에서는 1시간으로 잡았으나, 최대한 여유있게 잡는 것이 좋습니다.


구글에서 추천하는 방식 중 하나는, 앱이 실행중에 fetch해 놓고, 앱이 최초 실행됬을 때 그 값을 activate해서 업데이트 하는 것인데요.

이 방법이 본인이 사용하는 방식과 맞다면 사용해도 되지만, 업데이트가 상당히 늦어질 수 있다는 점 또한 생각해야 합니다.

좀더 정교하게 fetch한지 2시간정도가 지나고 난 경우에만 다음 fetch가 가능하도록,

시간을 체크하는 방법도 있을 것 같네요.


실시간 업데이트 용도로 제작된 서비스가 아니라고 구글에서도 단호하게 애기하고 있습니다.

그럴 경우에는 특정쿼터이상 사용하면 유료로 사용해야하는 realtime database같은 것을 사용하라고 하는군요.




4. 정리


이렇게 해서 RemoteConfig을 이용하는 방법에 대해서 정리해 보았습니다.

구현하기도 쉽고 편리하고 좋은 기능이라는 생각이 듭니다.

하지만, 자체적으로 구현한 서버로 한다면 테스트서버와 실서버를 구분해서 편리하게 테스트 할 수 있지만,

그런구분이 없는 관계로 클라우드 서버측 값을 바꿀 때마다 조심해서 사용한다는 점이 있을 것 같습니다.

또한 fetch를 하는데 있어서 api의 구조를 어느정도 이해하고 사용해야 한다는 점도 주의해야 하는데요.

RemoteConfig은 리얼타임데이터베이스로서 사용하는 것이 아니라는 것입니다.

앱의 버전 업데이트 같이 몇시간 혹은 반나절 정도의 텀이 발생해도 되는 그런 과업에 대해서 사용하는 것이 좋다고 하네요.


좀더 자세한 이야기나 architecture에 대해서는 firebase에서 블로그에 기고한 다음 글을 참고할 수 있을 것 같습니다.

https://firebase.googleblog.com/2017/01/firebase-remote-config-loading.html


RemoteConfig과 관련된 사항은 이 글을 통해서 업데이트 하도록 하겠습니다.


+ Recent posts