diff --git a/.github/workflows/deployLibraryYLS.yml b/.github/workflows/deployLibraryYLS.yml index 8e3756f..e5526cb 100644 --- a/.github/workflows/deployLibraryYLS.yml +++ b/.github/workflows/deployLibraryYLS.yml @@ -1,6 +1,6 @@ # YLS 라이브러리를 깃헙에 배포하는 워크플로입니다. # 깃허브에 배포되면 자동으로 jitpack에 등록됩니다. (https://jitpack.io/#yourssu/YLS-Android) -name: Deploy YDS Library +name: Deploy YLS Library # Github에서 수동으로 실행해야 합니다. on: workflow_dispatch diff --git a/yls/src/main/kotlin/com/yourssu/logging/system/Params.kt b/yls/src/main/kotlin/com/yourssu/logging/system/Params.kt new file mode 100644 index 0000000..e7803b7 --- /dev/null +++ b/yls/src/main/kotlin/com/yourssu/logging/system/Params.kt @@ -0,0 +1,10 @@ +package com.yourssu.logging.system + +@JvmInline +value class Params(internal val value: Map<String, Any>) { + constructor(vararg params: Pair<String, Any>) : this(params.toMap()) +} + +fun Map<String, Any>.toParams(): Params = Params(this) + +fun Pair<String, Any>.toParams(): Params = Params(this) diff --git a/yls/src/main/kotlin/com/yourssu/logging/system/YLS.kt b/yls/src/main/kotlin/com/yourssu/logging/system/YLS.kt index 6c31136..8d1cca2 100644 --- a/yls/src/main/kotlin/com/yourssu/logging/system/YLS.kt +++ b/yls/src/main/kotlin/com/yourssu/logging/system/YLS.kt @@ -95,15 +95,16 @@ class YLS private constructor() { } companion object Facade : Logger() { - private const val DEFAULT_VERSION = 1 + internal const val DEFAULT_VERSION = 1 private var version: Int = DEFAULT_VERSION - get() { - return field.also { field = DEFAULT_VERSION } - } + get() = field.also { field = DEFAULT_VERSION } private lateinit var logger: Logger - private lateinit var defaultEvent: Map<String, Any> private lateinit var hashedUserId: String + private var defaultEvent: Map<String, Any> = emptyMap() + + private var params: Params? = null + get() = field.also { field = null } /** * YLS 초기화. 앱의 Application.onCreate()에서 초기화하는 것을 권장합니다. @@ -147,12 +148,26 @@ class YLS private constructor() { return this } + fun params(params: Params): YLS.Facade { + this.params = params + return this + } + fun createLog(eventMap: Map<String, Any>): YLSEventData { + if (!::hashedUserId.isInitialized) { + throw AssertionError( + "Not initialized! : userId가 초기화되지 않았습니다.\n" + + "YLS.setUserId() 또는 YLS.init()을 먼저 호출해주세요.", + ) + } + val maybeParams = this.params.let { + if (it == null) emptyMap() else mapOf("params" to it.value) + } return YLSEventData( hashedId = hashedUserId, timestamp = getTimestamp(), version = this.version, - event = defaultEvent + eventMap, + event = defaultEvent + eventMap + maybeParams, ) } @@ -165,22 +180,27 @@ class YLS private constructor() { * @param events 이벤트 key-value 쌍 */ fun log(vararg events: Pair<String, Any>) { - if (!::logger.isInitialized) { - throw AssertionError("Not initialized! : YLS.init()을 먼저 호출해 주세요.") - } - val eventData = createLog(events.toMap()) log(eventData) } fun log(eventData: YLSEventData) { + if (!::logger.isInitialized) { + throw AssertionError( + "Not initialized! : logger가 초기화되지 않았습니다.\n" + + "YLS.setLogger() 또는 YLS.init()을 먼저 호출해 주세요.", + ) + } logger.enqueue(eventData) } /** Logger에 남아있는 로그 데이터를 모두 내보낸 후 큐를 비웁니다. */ override fun flush() { if (!::logger.isInitialized) { - throw AssertionError("Not initialized! : YLS.init()을 먼저 호출해 주세요.") + throw AssertionError( + "Not initialized! : logger가 초기화되지 않았습니다.\n" + + "YLS.setLogger() 또는 YLS.init()을 먼저 호출해 주세요.", + ) } logger.flush() } diff --git a/yls/src/test/kotlin/com/yourssu/logging/system/LoggingTest.kt b/yls/src/test/kotlin/com/yourssu/logging/system/LoggingTest.kt index e5e2e6b..5241e32 100644 --- a/yls/src/test/kotlin/com/yourssu/logging/system/LoggingTest.kt +++ b/yls/src/test/kotlin/com/yourssu/logging/system/LoggingTest.kt @@ -36,20 +36,27 @@ class LoggingTest { @Test fun ylsDebugClickLogging() { // 버튼 클릭 이벤트 - YLS.log( - "event" to "ButtonClicked", - "screen" to "LoginScreen", - ) + YLS.version(123) + .params(Params("likeCount" to 10)) + .log("screen" to "LoginScreen") val e = testLogger.lastEventData if (e != null) { assertEquals(YLS.hashString("abc"), e.hashedId) assertEquals("android", e.event["platform"]) - assertEquals("ButtonClicked", e.event["event"]) assertEquals("LoginScreen", e.event["screen"]) + assertEquals(123, e.version) + assertEquals(mapOf("likeCount" to 10), e.event["params"]) } else { assertTrue(false) // always fail } + + // 설정한 버전과 params는 설정할 때 한 번만 들어가고 + // 각각 DEFAULT_VERSION과 null로 초기화된다. + YLS.log() + val e2 = testLogger.lastEventData + assertEquals(YLS.DEFAULT_VERSION, e2!!.version) + assertEquals(null, e2.event["params"]) } @Test