DRAMA&COMPANY
We're Hiring!
No Result
View All Result
DRAMA&COMPANY
We're Hiring!
No Result
View All Result
DRAMA&COMPANY
No Result
View All Result

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

rfrost by rfrost
2018년 4월 9일
in Tech
Reading Time: 4 mins read
0

라이브로 운영하는 서비스는 항상 운영이슈가 존재합니다. 운영이슈는 사용자의 요구를 최대한 실시간으로 대응하여 불편함을 줄이고 만족도를 높이는 것을 의미합니다. 예를 들어 CS, 공지사항 부터 장애 모니터링 및 대응, 피드백 수집 후 개선까지도 모두 운영이슈로 볼 수 있습니다. 이 때 운영팀에서 가장 중요하게 생각하는 것은 실시간 입니다. 운영팀은 공지사항, 장애 등 이슈가 있을 때 원하는 시간에 바로바로 대응할 수 있는 시스템을 원합니다.

하지만 앱은 개발, 리뷰, 테스트, 스토어 업로드 등 여러 과정을 거쳐야 하므로 변경사항을 바로 반영하기가 힘듭니다. 이는 운영팀이 원하는 실시간과 거리가 멉니다. 운영팀이 원하는 것은 다음과 같습니다.

  1. 개발자를 통하지 않고 스스로 변경 가능하다.
  2. 코드를 손대지 않고 안전하게 변경한다.
  3. 배포하지 않고 변경사항을 적용한다.
  4. 원하는 사용자에게만 변경사항을 적용한다.

어떻게 운영팀이 원하는 이것을 이룰 수 있을까요?

해답은… 리모트 컨피그

리모트 컨피그는 사용자가 앱 업데이트를 통하지 않고 동작을 변경할 수 있는 실시간 클라우드 서비스 입니다. 사용 시나리오는 다음과 같습니다.

  1. Firebase에 앱의 동작을 제어하는 값을 정의한다.
  2. 앱에서 Firebase에 정의된 값을 가져와 적용한다.
  3. 배포 없이 업데이트 된 새로운 동작을 확인하다.

2,3번의 작업을 미리 앱에 배포해 놓으면, 운영팀에서 1번의 작업을 통해 배포 없이 자동으로 앱 업데이트가 가능합니다. 그러면 이제 사용법을 익혀봅시다.

1. Firebase, 리모트 컨피그 설치하기

Gradle에 의존성을 정의하고, Firebase Console에서 google-services.json을 받아와 app module에 추가합니다.

dependencies {
    classpath 'com.google.gms:google-services:3.0.0'
}
dependencies {
    compile 'com.google.firebase:firebase-core:10.2.0'
    compile 'com.google.firebase:firebase-config:10.2.0'
}

// Add this at the bottom of build.gradle in app module
apply plugin: 'com.google.gms.google-services'
google-services.json을 다운로드 후 app module에 위치

2. 구글 플레이 서비스 설치 체크

리모트 컨피그는 구글 플레이 서비스가 기기에 설치되어 있어야 사용 가능합니다. 앱을 시작할 때 구글 플레이 서비스 설치 여부를 확인하고, 안되어있다면 사용자에게 설치를 유도할 수 있도록 에러 팝업을 띄어줍니다.

private void checkGooglePlayServices() {
    GoogleApiAvailability googleApiAvailability = GoogleApiAvailability.getInstance();
    int status = googleApiAvailability.isGooglePlayServicesAvailable(context);

    if (status != ConnectionResult.SUCCESS) {
        Dialog dialog = googleApiAvailability.getErrorDialog(activity, status, -1);
        dialog.setOnDismissListener(dialogInterface -> finish());
        dialog.show();

        googleApiAvailability.showErrorNotification(context, status);
    }
}

 

3. 어드민에 값 추가하기

이제 운영팀이 자유롭게 변경하고 싶은 값을 정의해봅시다. 값 정의는 Fireabse 콘솔에 있는 리모트 컨피그 어드민에서 가능합니다.

리모트 컨피그 어드민에서 매개변수를 key, value 형태로 추가할 수 있습니다.
추가된 값들은 다음과 같이 보여집니다.

4. 리모트 컨피그 초기화하기

어드민에서 정의한 값들을 받아오기 위해 리모트 컨피그 객체를 초기화 합니다.

public static void initialize() {
    FirebaseRemoteConfig remoteConfig = FirebaseRemoteConfig.getInstance();
    FirebaseRemoteConfigSettings configSettings = new FirebaseRemoteConfigSettings.Builder()
            // Debug일 때 Developer Mode를 enable 하여 캐쉬 설정을 변경한다.
            .setDeveloperModeEnabled(BuildConfig.DEBUG)
            .build();

    remoteConfig.setConfigSettings(configSettings);
    // 로컬 기본값을 저장한 xml을 설정한다.
    remoteConfig.setDefaults(R.xml.remote_config_defaults);

    // 기본 캐쉬 만료시간은 12시간이다. Developer Mode 여부에 따라 fetch()에 적설한 캐시 만료시간을 넘긴다.
    remoteConfig.fetch(0).addOnCompleteListener(task -> {
        if (task.isSuccessful()) remoteConfig.activateFetched();
    });
}

setDefaults()로 설정한 remote_config_defaults.xml 에서는 어드민에서 값을 못받아올 경우 사용할 로컬 기본값들을 정의합니다.

<?xml version="1.0" encoding="utf-8"?>
<defaultsMap>
<entry>
    <key>example_key</key>
    <value>example local default value</value>
</entry>
<entry>
    <key>condition_example_key</key>
    <value>condition example local default value</value>
</entry>
</defaultsMap>

 

5. 어드민에서 값 가져오기

리모트 컨피그 객체의 getString() 메소드를 활용하여 넘겨준 key의 value를 가져옵니다.

public static String getConfigValue(String key) {
    FirebaseRemoteConfig remoteConfig = FirebaseRemoteConfig.getInstance();
    return remoteConfig.getString(key);
}

리멤버에서의 활용 예시

현재 리멤버에서는 다음과 같은 시나리오에서 리모트 컨피그를 활용하고 있습니다.

1. 메인 공지사항 팝업 이미지 및 액션

2. Drawer 추천유도 텍스트

3. 촬영 후 추천유도 텍스트, 이미지 및 액션

4. FAB 가이드 이미지 및 액션

5. 대기명함 가이드 텍스트

리모트 컨피그의 장점

1. 실시간 운영변수 변경 시스템 구축이 쉽다.

보통 라이브로 운영하는 서비스는 이러한 실시간 운영변수 변경 시스템을 직접 구축하여 사용합니다. 리멤버 또한 리모트 컨피그를 사용하기 전까지는 자체 시스템이 있었습니다. 하지만 직접 구현하는 것은 많은 리소스가 필요합니다. 리모트 컨피그를 사용하면 이런 시스템을 쉽게 갖출 수 있습니다.

2. 값을 단순히 변경하는 것 뿐만 아니라 대상을 선택하여 배포할 수 있다.

사용자 또는 기기 속성에 따라 값을 분기하여 배포하는 것은 유용한 기능이지만 개발하려면 손이 많이 가는 일입니다. 리모트 컨피그를 사용하면 쉽게 대상을 선택하여 배포할 수 있습니다.

마무리

리모트 컨피그는 라이브 서비스에게 매우 중요한 기능을 쉽고 빠르게 적용할 수 있도록 돕습니다. 저는 Firebase에서 가장 가성비가 좋은 기능이 리모트 컨피그가 아닌가 생각합니다. 이제 리모트 컨피그로 운영팀의 걱정을 덜어주세요.

– 이 글에 첨부된 코드는 https://github.com/rfrost77/DroidKnights-RemoteConfig 에 있습니다.

– 이 글은 미디엄에 쓴 포스팅을 옮겨왔습니다. http://bit.ly/2usHPvs

이 글 공유하기:

  • 트위터로 공유하기 (새 창에서 열림)
  • 페이스북에 공유하려면 클릭하세요. (새 창에서 열림)

관련

Related Posts

Snorkel을 이용한 직무 키워드 추출
AI Lab.

Snorkel을 이용한 직무 키워드 추출

안녕하세요. 빅데이터 센터 AI Lab의 이경호입니다. 오늘은 저희 팀에서 weak supervision framework 인 Snorkel을 키워드 추출 연구에 활용한 경험을 공유드리려고 합니다.이 글의 1장에서는 Snorkel을 사용하게 된 배경에 대해 설명드리고 2장에서는 Snorkel에 대한 간략한 설명을 드리겠습니다. 그리고 3장과 4장에서 실제 Snorkel의...

2022년 5월 13일
프로덕트 디자인팀 2022.1Q 회고
Design

프로덕트 디자인팀 2022.1Q 회고

어느덧 2022년의 4월도 마무리되어가고 있습니다. 조금 늦은 감이 있지만, 프로덕트 디자인팀은 워크샵을 통해 지난 1분기를 돌아보는 회고 시간을 가졌습니다. 이를 준비하게 된 계기와 짤막한 소감을 남겨 봅니다. 리멤버 프로덕트 디자인팀 본론에 앞서 리멤버 프로덕트 디자인 팀의 구성과 업무 공유 방식에...

2022년 4월 28일
Learning to Rank
AI Lab.

Learning to Rank

안녕하세요!😀  빅데이터센터 AI Lab 박민규입니다. 저번달에 작성한 Document Understanding 글에서 저희 빅데이터센터에서는 Recommendation System을 연구하고 있다고 했었는데요. 이번 글에서는 Recommendation System에서 사용되는 Learning to Rank(LTR)에 대해 소개하려고 합니다. Learning to Rank(LTR)이란 무엇일까? Learning to Rank(LTR)란 Ranking System에서 머신러닝을 사용하는 방법론을...

2022년 4월 6일
Next Post
Fabric Branch로 사용자 행동 분석하기

Fabric Branch로 사용자 행동 분석하기

리멤버 지원자분들이 묻는 질문 Top 4

리멤버 지원자분들이 묻는 질문 Top 4

답글 남기기 응답 취소

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

DRAMA&COMPANY

© 2021 DRAMA&COMPANY

Sites

    Follow Us

    No Result
    View All Result