| name | implementing-analytics |
| description | Use when adding or changing Firebase Analytics events, AnalyticsEvent definitions, AnalyticsLogger calls, screen view logs, click logs, filter logs, or completion logs in this Android repository. |
Implementing Analytics
analytics ๊ตฌํ์ core:analytics์ ์ด๋ฒคํธ ์ ์์ feature ViewModel์ ๋ก๊น
ํธ์ถ์ ํจ๊ป ๋ง์ถ๋ค.
์ด๋ฒคํธ๋ FirebaseAnalyticsLogger๋ฅผ ํตํด Firebase Analytics๋ก ์ ๋ฌํ๋ค.
์์
๋ฒ์
core/analytics/src/main/kotlin/com/neki/android/core/analytics/event/*AnalyticsEvent.kt
core/analytics/src/main/kotlin/com/neki/android/core/analytics/logger/FirebaseAnalyticsLogger.kt
- analytics๋ฅผ ํธ์ถํ๋
feature/<feature-name>/impl/src/main/.../*ViewModel.kt
- ํ๋ฉด ์ง์
๋ก๊ทธ ํธ์ถ ์ง์ ์ด ์๋
feature/<feature-name>/impl/src/main/.../*Screen.kt
- ์ฑ ์์ค ์ด๋ฒคํธ(๋
ธํฐํผ์ผ์ด์
ํด๋ฆญ ๋ฑ)๋ฅผ ๋ก๊น
ํ๋
app/src/main/java/com/neki/android/app/MainActivity.kt
๊ตฌํ ํ๋ฆ
- ์ด๋ฒคํธ๊ฐ ์ํ ๊ธฐ๋ฅ ๋จ์
*AnalyticsEvent๋ฅผ ๊ณ ๋ฅธ๋ค.
- parameter ์๋ ์ด๋ฒคํธ๋
data object, parameter ์๋ ์ด๋ฒคํธ๋ data class๋ก ์ถ๊ฐํ๋ค.
- event
name๊ณผ parameter key๋ snake_case๋ก ๋๋ค. ํด๋์ค๋ช
์ด ๊ณง ์ด๋ฒคํธ๋ช
์ ์๋๋ฏ๋ก(Logout โ "mypage_logout") ๋๋ฉ์ธ๋ณ ๊ธฐ์กด ๋ค์ด๋ฐ ๊ด๋ก๋ฅผ ๋ฐ๋ฅธ๋ค.
- ViewModel์
AnalyticsLogger๋ฅผ ์ฃผ์
ํ๋ค.
- ๋ก๊ทธ๊ฐ ๋ฐ์ํ๋ trigger์ ๋ง์ถฐ intent ๋ถ๊ธฐ, private handler, API ์ฑ๊ณต ๋ถ๊ธฐ์
analyticsLogger.log(...)๋ฅผ ๋๋ค.
- ํ๋ฉด ์ง์
๋ก๊ทธ๊ฐ composition ์ง์
๊ธฐ์ค์ด๋ฉด Route์
LaunchedEffect(Unit)์์ ViewModel์ log<์ด๋ฒคํธ๋ช
>() ํจ์๋ง ํธ์ถํ๋ค(logMapView, logPoseView, logArchivingView). ViewModel ์์ฑ ๊ธฐ์ค์ด๋ฉด init ๋ธ๋ก์์ ๋ก๊น
ํ๋ค(PhotoDetailView).
- ์ฌ์ฉ์ ์๋ณ/์์ฑ์
setUserId(...), setUserProperty(...)๋ฅผ ์ด๋ค.
- ์ parameter key๋ฅผ ์ถ๊ฐํ๋ฉด GA4 ์์ฑ์ ๋ง์ถค ์ธก์ ๊ธฐ์ค(custom dimension) ๋ฑ๋ก์ด ํ์ํ๋ค. ๋ฃจํธ์
GA4_EVENTS.md๊ฐ ์์ผ๋ฉด ๋ช
์ธ๋ ํจ๊ป ๊ฐฑ์ ํ๋ค.
Logger
FirebaseAnalyticsLogger๋ AnalyticsEvent๋ฅผ Firebase Analytics์ logEvent(...)๋ก ์ ๋ฌํ๋ค.
feature ViewModel์ AnalyticsLogger๋ฅผ ์ฃผ์
๋ฐ์ ํธ์ถํ๋ค.
Event ์ ์
sealed interface FeatureAnalyticsEvent : AnalyticsEvent {
data object FeatureView : FeatureAnalyticsEvent {
override val name = "feature_view"
}
data class ConfirmClick(
val source: String,
val selectedCount: Int,
) : FeatureAnalyticsEvent {
override val name = "confirm_click"
override val params = mapOf(
"source" to source,
"selected_count" to selectedCount,
)
}
}
Firebase Analytics parameter value๋ String, Int, Long, Double, Boolean์ ์ด๋ค.
๊ทธ ์ธ ํ์
์ ์ปดํ์ผ ํ์์ ๊ฑธ๋ฌ์ง์ง ์๊ณ toString() ๋ฌธ์์ด๋ก ๋ณํ๋์ด ์ ์ก๋๋ฏ๋ก ์ 5๊ฐ ํ์
๋ง ๋ฃ๋๋ค.
๋ํ ๋ก๊น
์ผ์ด์ค
| ๊ตฌ๋ถ | ์์ |
|---|
| ํ๋ฉด ์ง์
| MapView, PoseView, ArchivingView, PhotoDetailView |
| ์ฑ ์ง์
| AppOpen, NotificationClick(MainActivity์์ ๋ก๊น
) |
| ๋ฒํผ/CTA | MapRouteClick, PoseBookmark, Logout, Withdraw |
| ๊ฒ์/ํํฐ/์ ํ | MapReSearch, MapBrandFilterToggle, PoseFilterToggle, BoothSelect |
| ์์
์๋ฃ | PhotoUpload, AlbumCreate, AlbumAddFromDetail, AlbumAddFromMulti, PhotoMemoCreate |
| ์ด๋/๋ณต์ฌ | PhotoMove, PhotoCopy |
ViewModel ๋ก๊น
@HiltViewModel
internal class FeatureViewModel @Inject constructor(
private val analyticsLogger: AnalyticsLogger,
) : ViewModel()
when (intent) {
FeatureIntent.ClickConfirmButton -> {
analyticsLogger.log(FeatureAnalyticsEvent.ConfirmClick(...))
...
}
}
repository.request(...)
.onSuccess {
analyticsLogger.log(FeatureAnalyticsEvent.FeatureComplete)
...
}
์ฌ์ฉ์ ์์ฑ
setUserId์ platform์ ๋ก๊ทธ์ธ ์ฑ๊ณต ์, app_version์ ์คํ๋์ ์ง์
์ ์ค์ ํ๋ค. ๋น๋ก๊ทธ์ธ ์ด๋ฒคํธ๋ user_id๊ฐ ๋น ์ํ๋ก ์์ง๋๋ค.
analyticsLogger.setUserId(userId.toString())
analyticsLogger.setUserProperty("platform", "android")
analyticsLogger.setUserProperty("app_version", currentAppVersion)