헤이딜러에서 Analytics SDK들을 쉽게 관리하는 방법

피알앤디컴퍼니

앱에서 event가 발생했을때 AnalyticsUtil에만 이를 알리고 알아서 각각의 Analytics SDK에 이를 알리도록 설계하는 방식에 대해 공유합니다

안녕하세요. 헤이딜러 Android팀의 박상권입니다.

앱 서비스를 하다보면 마케팅이나 기획적으로 여러가지를 분석하기 위해 여러가지 Analytics 서비스📊들을 사용하게 됩니다.

Firebase Analytics

Google Analytics(모바일은 지원종료)

Facebook Analytics

AppsFlyer

Mixpanel

등등

서비스를 운영하다 보면 대부분 아래와 같은 흐름으로 흘러갑니다

A 분석 SDK를 추가해달라는 요청이 있어서 SDK를 설정하고 사용자 정보를 추가하고 event logging이 필요한 부분에 A라이브러리 코드 추가

B 분석 SDK도 추가해달라는 요청이 와서 기존 A라이브러리를 추가할때 추가해뒀던 event logging 코드를 모두 찾아서 B라이브러리 코드도 추가

가끔 몇개 부분에 event logging코드 추가하는거 까먹어서 A에는 event가 찍히는데 B에는 event가 안찍힘(혼남😭)

새로 이벤트 로깅을 해야할때마다 A,B 모두에 event logging 코드 추가해야함(귀찮음)

C 분석 SDK를 추가해달라는 요청이 오면 다시 또 2~4번 반복 이번에는 A,B,C 모두에 event logging 코드 추가해야됨(너무 귀찮음)

이런 경험을 해보신 분들은 얼마나 귀찮고 많은 실수를 야기시키는 상황이라는것을 공감 하실 겁니다.😭😭

이러한 귀찮고 힘든 Analytics SDK를 간결하고 쉽게 관리하는 방법에 대해서 공유합니다

결론부터 이야기하고 시작합니다.

앱에서 event가 발생했을때 AnalyticsUtil 에만 이를 알리고 AnalyticsUtil 가 알아서 각각의 Analytics SDK에 이를 알리도록 설계되어 있습니다.

코드로 먼저 확인하고 싶으신 분들은 아래 GitHub에서 코드를 살펴보세요

PRNDcompany/AnalyticsSdkSample Contribute to PRNDcompany/AnalyticsSdkSample development by creating an account on GitHub.github.com

AnalyticsUtil 과 AnalyticsSdk 라는 개념을 만들어서 사용하는 방법에 대해서 설명합니다.

동작 순서

AnalyticsSdk 추가

AnalyticsSdk를 구현하는 각 Analytics SDK 구현체 생성

AnalyticsUtil 추가

AnalyticsUtil 에서 사용하는 Analytics SDK 개수만큼 목록들을 가지고 있고 사용될때마다 각각의 AnalyticsSdk에 event 전달

앱에서 event가 발생할때 AnalyticsUtil에게만 전달

AnalyticsSdk

Analytics SDK들이 구현 해주어야할 추상화된 개념의 AnalyticsSdk interface를 만들어 줍니다.

interface AnalyticsSdk {
    fun init(context: Context)
    fun isInitialized(): Boolean
    fun setUserId(userId: String)
    fun setUserProperties(properties: Map)
    fun screen(activity: Activity, name: String)
    fun event(name: String)
    ...생략
}

AnalyticsSdk 구현체

각자의 앱에서 사용하고 있는 Analytics SDK개수만큼 AnalyticsSdk 를 구현하는 구현체를 만들어 줍니다.

헤이딜러에서는 Analytics SDK로 Firebase, Facebook, AppsFlyer를 사용하고 있기 때문에 FirebaseAnalyticsSdk, FacebookAnalyticsSdk, AppsFlyerAnalyticsSdk 를 각각 만들어 줍니다.

AnalyticsUtil

앱에서 직접 사용할 AnalyticsUtil을 만들어줍니다.

AnalyticsUtil 또한 AnalyticsSdk를 구현하도록 설계합니다. 만약 AnalyticsSdk에 새로운 함수가 추가된다면, 자연스럽게 AnalyticsUtil에도 관련된 함수를 구현해야 하는 것을 강제할 수 있기 때문에 실수를 줄일 수 있습니다.

object AnalyticsUtil : AnalyticsSdk {

    private val analyticsSdkList: List =
        listOf(
            FirebaseAnalyticsSdk(),
            FacebookAnalyticsSdk(),
            AppsFlyerAnalyticsSdk()
        )

    override fun init(context: Context) {
        analyticsSdkList.forEach { it.init(context) }
    }
    ...생략
    override fun setUserId(userId: String) {
        analyticsSdkList.forEach { it.setUserId(userId) }
    }

    override fun screen(activity: Activity, name: String) {
        analyticsSdkList.forEach { it.screen(activity, name) }
    }

    override fun event(name: String) {
        analyticsSdkList.forEach { it.event(name) }
    }
    ...생략
}

AnalyticsUtil에서는 AnalyticsSdk의 목록을 가지고 있고 관련된 함수가 호출될때마다 각 AnalyticsSdk에 해당 함수를 전달합니다.

이 개념의 구조는 아래와 같은 방식으로 구성됩니다.

이것이 바로 책에서만 배우던 객체지향 5대 원칙인 S.O.L.I.D 중 Dependency Inversion Principle (의존 역전 원칙)에 해당된다고 볼 수 있습니다.

이와 같은 구조로 만들면 아래와 같은 장점이 있습니다.

새로운 Analytics SDK를 추가해야 하는 경우, AnalyticsSdk를 구현하는 클래스를 만들고 AnalyticsUtil의 목록에 추가하기만 하면 됨

더이상 필요 없어진 Analytics SDK를 제거해야 하는 경우, AnalyticsUtil목록에서 제거하고 해당 AnalyticsSdk구현 클래스만 제거하면 됨

새로운 기능/동작이 필요한 경우, AnalyticsSdk에 function을 추가하면 알아서 이를 구현하는 코드들에서 관련 기능을 구현하도록 강제함

위의 코드들은 GitHub 샘플 프로젝트로 확인하실 수 있습니다.

PRNDcompany/AnalyticsSdkSample Contribute to PRNDcompany/AnalyticsSdkSample development by creating an account on GitHub.github.com

어때요? Analytics SDK 관리하기 참 쉽죠?

마치며

수많은 삽질과 시행착오와 고민을 하다보면 어떻게 효율적으로 개선할 수 있을지에 고민하게 되고

그렇게 완성해보고 나면 대학교 수업시간때 ‘이거 배워서 어디다 써먹는다고…’ 했던 개념들이 정말 도움이 되는 경험이 많은것 같습니다.

헤이딜러 안드로이드앱에서 사용중인 Analytics SDK들을 쉽게 관리하는 방법을 유용하게 활용하시기 바랍니다.

혹시 이 방법외에도 효율적으로 이런것들을 관리하고 계시는 것들이 있다면 댓글로 남겨주시면 감사하겠습니다.

여러분들의 +50 박수👏와 팔로우👀는 저와 저희 회사에 많은 의욕을 불러 일으키고 도움이 됩니다.

저희와 함께 헤이딜러 서비스를 발전 시켜나가실 분들을 기다리고 있습니다.

http://bit.ly/prnd-hiring

위의 채용링크로 많은 지원부탁드립니다.

감사합니다.

기업문화 엿볼 때, 더팀스

로그인

/