diff --git a/common/utils/src/main/kotlin/com/sangdol/common/utils/MdcStartTimeUtil.kt b/common/utils/src/main/kotlin/com/sangdol/common/utils/MdcStartTimeUtil.kt new file mode 100644 index 00000000..0e15ecfe --- /dev/null +++ b/common/utils/src/main/kotlin/com/sangdol/common/utils/MdcStartTimeUtil.kt @@ -0,0 +1,25 @@ +package com.sangdol.common.utils + +import org.slf4j.MDC + +object MdcStartTimeUtil { + const val MDC_START_TIME_KEY = "start_time" + + fun extractDurationMsOrNull(): Long? { + return extractOrNull()?.let { System.currentTimeMillis() - it } + } + + fun setCurrentTime() { + extractOrNull() ?: run { + MDC.put(MDC_START_TIME_KEY, System.currentTimeMillis().toString()) + } + } + + fun clear() { + MDC.remove(MDC_START_TIME_KEY) + } + + private fun extractOrNull(): Long? { + return MDC.get(MDC_START_TIME_KEY)?.toLong() + } +} diff --git a/common/utils/src/test/kotlin/com/sangdol/common/utils/MdcPrincipalIdUtilTest.kt b/common/utils/src/test/kotlin/com/sangdol/common/utils/MdcPrincipalIdUtilTest.kt index 388c61d8..043d4646 100644 --- a/common/utils/src/test/kotlin/com/sangdol/common/utils/MdcPrincipalIdUtilTest.kt +++ b/common/utils/src/test/kotlin/com/sangdol/common/utils/MdcPrincipalIdUtilTest.kt @@ -25,4 +25,4 @@ class MdcPrincipalIdUtilTest : StringSpec({ MdcPrincipalIdUtil.extractAsOptionalLongOrEmpty() shouldBe Optional.empty() } } -}) \ No newline at end of file +}) diff --git a/common/utils/src/test/kotlin/com/sangdol/common/utils/MdcStartTimeUtilTest.kt b/common/utils/src/test/kotlin/com/sangdol/common/utils/MdcStartTimeUtilTest.kt new file mode 100644 index 00000000..0f57e753 --- /dev/null +++ b/common/utils/src/test/kotlin/com/sangdol/common/utils/MdcStartTimeUtilTest.kt @@ -0,0 +1,34 @@ +package com.sangdol.common.utils + +import io.kotest.core.spec.style.FunSpec +import io.kotest.matchers.nulls.shouldNotBeNull +import io.kotest.matchers.shouldBe + +class MdcStartTimeUtilTest : FunSpec({ + + test("기존에 등록된 startTime 값을 기준으로 duration_ms를 구한다.") { + MdcStartTimeUtil.setCurrentTime() + MdcStartTimeUtil.extractDurationMsOrNull().shouldNotBeNull() + MdcStartTimeUtil.clear() + } + + test("기존에 등록된 startTime 값이 없으면 duration_ms는 null이다.") { + MdcStartTimeUtil.extractDurationMsOrNull() shouldBe null + } + + test("현재 시간을 등록한다.") { + MdcStartTimeUtil.setCurrentTime() + MdcStartTimeUtil.extractDurationMsOrNull().shouldNotBeNull() + MdcStartTimeUtil.clear() + } + + test("등록된 시간을 지운다.") { + MdcStartTimeUtil.setCurrentTime().also { + MdcStartTimeUtil.extractDurationMsOrNull().shouldNotBeNull() + } + + MdcStartTimeUtil.clear().also { + MdcStartTimeUtil.extractDurationMsOrNull() shouldBe null + } + } +})