generated from pricelees/issue-pr-template
[#48] Tosspay mocking 서버 구현을 위한 멀티모듈 전환 #49
11
common/config/build.gradle.kts
Normal file
11
common/config/build.gradle.kts
Normal file
@ -0,0 +1,11 @@
|
||||
plugins {
|
||||
id("org.springframework.boot")
|
||||
kotlin("plugin.spring")
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation("org.springframework.boot:spring-boot-starter-web")
|
||||
implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
|
||||
|
||||
testImplementation("io.kotest:kotest-runner-junit5:5.9.1")
|
||||
}
|
||||
@ -1,4 +1,4 @@
|
||||
package com.sangdol.roomescape.common.config
|
||||
package com.sangdol.common.config
|
||||
|
||||
import com.fasterxml.jackson.core.JsonGenerator
|
||||
import com.fasterxml.jackson.databind.DeserializationFeature
|
||||
@ -23,6 +23,9 @@ class JacksonConfig {
|
||||
companion object {
|
||||
private val ISO_OFFSET_DATE_TIME_FORMATTER: DateTimeFormatter =
|
||||
DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssXXX")
|
||||
|
||||
private val LOCAL_TIME_FORMATTER: DateTimeFormatter =
|
||||
DateTimeFormatter.ofPattern("HH:mm")
|
||||
}
|
||||
|
||||
@Bean
|
||||
@ -43,11 +46,11 @@ class JacksonConfig {
|
||||
)
|
||||
.addSerializer(
|
||||
LocalTime::class.java,
|
||||
LocalTimeSerializer(DateTimeFormatter.ofPattern("HH:mm"))
|
||||
LocalTimeSerializer(LOCAL_TIME_FORMATTER)
|
||||
)
|
||||
.addDeserializer(
|
||||
LocalTime::class.java,
|
||||
LocalTimeDeserializer(DateTimeFormatter.ofPattern("HH:mm"))
|
||||
LocalTimeDeserializer(LOCAL_TIME_FORMATTER)
|
||||
) as JavaTimeModule
|
||||
|
||||
private fun dateTimeModule(): SimpleModule {
|
||||
@ -1,4 +1,4 @@
|
||||
package com.sangdol.roomescape.common.config
|
||||
package com.sangdol.common.config
|
||||
|
||||
import com.fasterxml.jackson.databind.ObjectMapper
|
||||
import com.fasterxml.jackson.databind.exc.InvalidFormatException
|
||||
@ -6,11 +6,15 @@ import io.kotest.assertions.throwables.shouldThrow
|
||||
import io.kotest.core.spec.style.FunSpec
|
||||
import io.kotest.matchers.shouldBe
|
||||
import io.kotest.matchers.string.shouldContain
|
||||
import java.time.*
|
||||
import java.time.LocalDate
|
||||
import java.time.LocalDateTime
|
||||
import java.time.LocalTime
|
||||
import java.time.OffsetDateTime
|
||||
import java.time.ZoneOffset
|
||||
|
||||
class JacksonConfigTest(
|
||||
private val objectMapper: ObjectMapper = JacksonConfig().objectMapper()
|
||||
) : FunSpec({
|
||||
class JacksonConfigTest : FunSpec({
|
||||
|
||||
val objectMapper: ObjectMapper = JacksonConfig().objectMapper()
|
||||
|
||||
context("날짜는 yyyy-mm-dd 형식이다.") {
|
||||
val date = "2025-07-14"
|
||||
@ -35,7 +35,6 @@ dependencies {
|
||||
|
||||
// Kotlin
|
||||
implementation("org.jetbrains.kotlin:kotlin-reflect")
|
||||
implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
|
||||
implementation("io.github.oshai:kotlin-logging-jvm:7.0.3")
|
||||
|
||||
// Test
|
||||
@ -53,6 +52,9 @@ dependencies {
|
||||
|
||||
// etc
|
||||
implementation("org.apache.poi:poi-ooxml:5.2.3")
|
||||
|
||||
// submodules
|
||||
implementation(project(":common:config"))
|
||||
}
|
||||
|
||||
tasks.jar {
|
||||
|
||||
@ -4,7 +4,9 @@ import org.springframework.boot.Banner
|
||||
import org.springframework.boot.SpringApplication
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication
|
||||
|
||||
@SpringBootApplication
|
||||
@SpringBootApplication(
|
||||
scanBasePackages = ["com.sangdol.roomescape", "com.sangdol.common"]
|
||||
)
|
||||
class RoomescapeApplication
|
||||
|
||||
fun main(args: Array<String>) {
|
||||
|
||||
@ -7,7 +7,7 @@ import com.fasterxml.jackson.databind.ObjectMapper
|
||||
import com.fasterxml.jackson.databind.node.ArrayNode
|
||||
import com.fasterxml.jackson.databind.node.ObjectNode
|
||||
import com.fasterxml.jackson.databind.node.TextNode
|
||||
import com.sangdol.roomescape.common.config.JacksonConfig
|
||||
import com.sangdol.common.config.JacksonConfig
|
||||
|
||||
private const val MASK: String = "****"
|
||||
private val SENSITIVE_KEYS = setOf("password", "accessToken", "phone")
|
||||
|
||||
@ -1,17 +1,17 @@
|
||||
package com.sangdol.roomescape.common.log
|
||||
|
||||
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
|
||||
import com.sangdol.common.config.JacksonConfig
|
||||
import com.sangdol.roomescape.auth.exception.AuthErrorCode
|
||||
import com.sangdol.roomescape.auth.exception.AuthException
|
||||
import io.kotest.core.spec.style.StringSpec
|
||||
import io.kotest.matchers.shouldBe
|
||||
import io.mockk.every
|
||||
import io.mockk.mockk
|
||||
import jakarta.servlet.http.HttpServletRequest
|
||||
import org.slf4j.MDC
|
||||
import com.sangdol.roomescape.auth.exception.AuthErrorCode
|
||||
import com.sangdol.roomescape.auth.exception.AuthException
|
||||
|
||||
class ApiLogMessageConverterTest : StringSpec({
|
||||
val converter = ApiLogMessageConverter(jacksonObjectMapper())
|
||||
val converter = ApiLogMessageConverter(JacksonConfig().objectMapper())
|
||||
val request: HttpServletRequest = mockk()
|
||||
|
||||
beforeTest {
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -1,6 +1,7 @@
|
||||
package com.sangdol.roomescape.supports
|
||||
|
||||
import com.fasterxml.jackson.module.kotlin.convertValue
|
||||
import com.sangdol.common.config.JacksonConfig
|
||||
import com.sangdol.roomescape.common.exception.ErrorCode
|
||||
import io.restassured.module.kotlin.extensions.Given
|
||||
import io.restassured.module.kotlin.extensions.Then
|
||||
import io.restassured.module.kotlin.extensions.When
|
||||
@ -10,8 +11,6 @@ import io.restassured.specification.RequestSpecification
|
||||
import org.hamcrest.CoreMatchers.equalTo
|
||||
import org.springframework.http.HttpMethod
|
||||
import org.springframework.http.MediaType
|
||||
import com.sangdol.roomescape.common.config.JacksonConfig
|
||||
import com.sangdol.roomescape.common.exception.ErrorCode
|
||||
|
||||
fun runTest(
|
||||
token: String? = null,
|
||||
@ -103,10 +102,10 @@ object ResponseParser {
|
||||
val objectMapper = JacksonConfig().objectMapper()
|
||||
|
||||
inline fun <reified T> parseListResponse(response: List<LinkedHashMap<String, Any>>): List<T> {
|
||||
return response.map { objectMapper.convertValue<T>(it) }
|
||||
return response.map { objectMapper.convertValue(it, T::class.java) }
|
||||
}
|
||||
|
||||
inline fun <reified T> parseSingleResponse(response: LinkedHashMap<String, Any>): T {
|
||||
return objectMapper.convertValue<T>(response)
|
||||
return objectMapper.convertValue(response, T::class.java)
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user