diff --git a/src/main/kotlin/kr/wooco/woocobe/common/ui/config/JacksonConfig.kt b/src/main/kotlin/kr/wooco/woocobe/common/ui/config/JacksonConfig.kt index af6c97ab..5ff0dc8a 100644 --- a/src/main/kotlin/kr/wooco/woocobe/common/ui/config/JacksonConfig.kt +++ b/src/main/kotlin/kr/wooco/woocobe/common/ui/config/JacksonConfig.kt @@ -1,13 +1,19 @@ package kr.wooco.woocobe.common.ui.config +import com.fasterxml.jackson.core.JsonGenerator import com.fasterxml.jackson.databind.DeserializationFeature +import com.fasterxml.jackson.databind.JsonSerializer import com.fasterxml.jackson.databind.ObjectMapper import com.fasterxml.jackson.databind.PropertyNamingStrategies import com.fasterxml.jackson.databind.SerializationFeature +import com.fasterxml.jackson.databind.SerializerProvider +import com.fasterxml.jackson.databind.module.SimpleModule import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration +import kotlin.math.abs +import kotlin.math.pow @Configuration class JacksonConfig { @@ -15,8 +21,31 @@ class JacksonConfig { fun objectMapper(): ObjectMapper = jacksonObjectMapper().apply { propertyNamingStrategy = PropertyNamingStrategies.SNAKE_CASE - registerModule(JavaTimeModule()) disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) + registerModules(JavaTimeModule(), optimizedStringSerializerModule()) } + + private fun optimizedStringSerializerModule(): SimpleModule = + SimpleModule().apply { + addSerializer(Long::class.java, OptimizedLongSerializer) + } + + data object OptimizedLongSerializer : JsonSerializer() { + override fun serialize( + value: Long, + gen: JsonGenerator, + serializers: SerializerProvider, + ) { + if (abs(value) > THRESHOLD) { + gen.writeString(value.toString()) + } else { + gen.writeNumber(value) + } + } + } + + companion object { + private val THRESHOLD = 2.0.pow(53.0) + } } diff --git a/src/main/resources/config b/src/main/resources/config index a113a5d1..c6b108bc 160000 --- a/src/main/resources/config +++ b/src/main/resources/config @@ -1 +1 @@ -Subproject commit a113a5d193ad897c5472f5b6ecdcd92f701c3116 +Subproject commit c6b108bcb51e3b3970dd3b728b894876d2318120