diff --git a/common/log/src/test/kotlin/com/sangdol/common/log/AbstractLogMaskingConverterTest.kt b/common/log/src/test/kotlin/com/sangdol/common/log/AbstractLogMaskingConverterTest.kt index eeb74b46..a9cb953c 100644 --- a/common/log/src/test/kotlin/com/sangdol/common/log/AbstractLogMaskingConverterTest.kt +++ b/common/log/src/test/kotlin/com/sangdol/common/log/AbstractLogMaskingConverterTest.kt @@ -7,7 +7,6 @@ import io.kotest.assertions.assertSoftly import io.kotest.core.spec.style.FunSpec import io.kotest.matchers.equals.shouldBeEqual import io.kotest.matchers.shouldBe -import io.kotest.matchers.string.shouldContain import io.mockk.every import io.mockk.mockk @@ -48,7 +47,10 @@ class AbstractLogMaskingConverterTest : FunSpec({ event.formattedMessage } returns json.format(account, address) - converter.convert(event) shouldBeEqual json.format("${account.first()}${converter.mask}${account.last()}", "${address.first()}${converter.mask}${address.last()}") + converter.convert(event) shouldBeEqual json.format( + "${account.first()}${converter.mask}${account.last()}", + "${address.first()}${converter.mask}${address.last()}" + ) } } } diff --git a/common/persistence/src/test/kotlin/com/sangdol/common/persistence/TestAuditingBaseEntity.kt b/common/persistence/src/test/kotlin/com/sangdol/common/persistence/TestAuditingBaseEntity.kt index f58ecf77..b687de9e 100644 --- a/common/persistence/src/test/kotlin/com/sangdol/common/persistence/TestAuditingBaseEntity.kt +++ b/common/persistence/src/test/kotlin/com/sangdol/common/persistence/TestAuditingBaseEntity.kt @@ -7,6 +7,6 @@ import org.springframework.data.jpa.repository.JpaRepository class TestAuditingBaseEntity( id: Long, val name: String -): AuditingBaseEntity(id) +) : AuditingBaseEntity(id) -interface TestAuditingBaseEntityRepository: JpaRepository \ No newline at end of file +interface TestAuditingBaseEntityRepository : JpaRepository \ No newline at end of file diff --git a/common/persistence/src/test/kotlin/com/sangdol/common/persistence/TestPersistableBaseEntity.kt b/common/persistence/src/test/kotlin/com/sangdol/common/persistence/TestPersistableBaseEntity.kt index ac97c1c2..5a29c4ea 100644 --- a/common/persistence/src/test/kotlin/com/sangdol/common/persistence/TestPersistableBaseEntity.kt +++ b/common/persistence/src/test/kotlin/com/sangdol/common/persistence/TestPersistableBaseEntity.kt @@ -7,6 +7,6 @@ import org.springframework.data.jpa.repository.JpaRepository class TestPersistableBaseEntity( id: Long, val name: String -): PersistableBaseEntity(id) +) : PersistableBaseEntity(id) -interface TestPersistableBaseEntityRepository: JpaRepository \ No newline at end of file +interface TestPersistableBaseEntityRepository : JpaRepository \ No newline at end of file diff --git a/common/persistence/src/test/kotlin/com/sangdol/common/persistence/TransactionExecutionUtilTest.kt b/common/persistence/src/test/kotlin/com/sangdol/common/persistence/TransactionExecutionUtilTest.kt index 64f4faa6..35516c3a 100644 --- a/common/persistence/src/test/kotlin/com/sangdol/common/persistence/TransactionExecutionUtilTest.kt +++ b/common/persistence/src/test/kotlin/com/sangdol/common/persistence/TransactionExecutionUtilTest.kt @@ -5,11 +5,7 @@ import io.kotest.core.spec.style.FunSpec import io.kotest.matchers.equality.shouldBeEqualUsingFields import io.kotest.matchers.nulls.shouldNotBeNull import io.kotest.matchers.shouldBe -import io.mockk.clearMocks -import io.mockk.every -import io.mockk.mockk -import io.mockk.slot -import io.mockk.verify +import io.mockk.* import org.junit.jupiter.api.assertThrows import org.springframework.transaction.PlatformTransactionManager import org.springframework.transaction.TransactionDefinition diff --git a/common/utils/src/test/kotlin/com/sangdol/common/utils/KoreaDateTimeExtensionsTest.kt b/common/utils/src/test/kotlin/com/sangdol/common/utils/KoreaDateTimeExtensionsTest.kt index e6f9a3c6..321d1650 100644 --- a/common/utils/src/test/kotlin/com/sangdol/common/utils/KoreaDateTimeExtensionsTest.kt +++ b/common/utils/src/test/kotlin/com/sangdol/common/utils/KoreaDateTimeExtensionsTest.kt @@ -30,7 +30,8 @@ class KoreaDateTimeExtensionsTest : FunSpec({ assertSoftly(KoreaDateTime.nowWithOffset()) { val utcNow = OffsetDateTime.now(ZoneId.of("UTC")) - this.toLocalDateTime().withSecond(0).withNano(0) shouldBe utcNow.toLocalDateTime().plusHours(9).withSecond(0).withNano(0) + this.toLocalDateTime().withSecond(0).withNano(0) shouldBe utcNow.toLocalDateTime().plusHours(9) + .withSecond(0).withNano(0) } } diff --git a/common/web/src/main/kotlin/com/sangdol/common/web/asepct/ServiceObservationAspect.kt b/common/web/src/main/kotlin/com/sangdol/common/web/asepct/ServiceObservationAspect.kt index 1324e5a6..c41f730c 100644 --- a/common/web/src/main/kotlin/com/sangdol/common/web/asepct/ServiceObservationAspect.kt +++ b/common/web/src/main/kotlin/com/sangdol/common/web/asepct/ServiceObservationAspect.kt @@ -13,7 +13,8 @@ class ServiceObservationAspect( ) { @Pointcut("execution(* com.sangdol..business..*Service*.*(..))") - fun allServices() {} + fun allServices() { + } @Around("allServices()") fun runWithObserve(joinPoint: ProceedingJoinPoint): Any? { diff --git a/common/web/src/main/kotlin/com/sangdol/common/web/support/log/WebLogMessageConverter.kt b/common/web/src/main/kotlin/com/sangdol/common/web/support/log/WebLogMessageConverter.kt index 1a2c47a7..48653a11 100644 --- a/common/web/src/main/kotlin/com/sangdol/common/web/support/log/WebLogMessageConverter.kt +++ b/common/web/src/main/kotlin/com/sangdol/common/web/support/log/WebLogMessageConverter.kt @@ -18,7 +18,10 @@ class WebLogMessageConverter( return objectMapper.writeValueAsString(payload) } - fun convertToControllerInvokedMessage(servletRequest: HttpServletRequest, controllerPayload: Map): String { + fun convertToControllerInvokedMessage( + servletRequest: HttpServletRequest, + controllerPayload: Map + ): String { val payload = LogPayloadBuilder(type = LogType.CONTROLLER_INVOKED, servletRequest = servletRequest) .endpoint() .principalId() diff --git a/common/web/src/test/kotlin/com/sangdol/common/web/support/log/LogPayloadBuilderTest.kt b/common/web/src/test/kotlin/com/sangdol/common/web/support/log/LogPayloadBuilderTest.kt index 0b905efa..a5a8022e 100644 --- a/common/web/src/test/kotlin/com/sangdol/common/web/support/log/LogPayloadBuilderTest.kt +++ b/common/web/src/test/kotlin/com/sangdol/common/web/support/log/LogPayloadBuilderTest.kt @@ -23,7 +23,7 @@ class LogPayloadBuilderTest : FunSpec({ beforeTest { method = "GET".also { every { servletRequest.method } returns it } requestUri = "/converter/test".also { every { servletRequest.requestURI } returns it } - remoteAddr = "localhost".also { every { servletRequest.remoteAddr } returns it } + remoteAddr = "localhost".also { every { servletRequest.remoteAddr } returns it } userAgent = "Mozilla/5.0".also { every { servletRequest.getHeader("User-Agent") } returns it } queryString = "key=value".also { every { servletRequest.queryString } returns it } } diff --git a/common/web/src/test/kotlin/com/sangdol/common/web/support/log/WebLogMessageConverterTest.kt b/common/web/src/test/kotlin/com/sangdol/common/web/support/log/WebLogMessageConverterTest.kt index 84a1f62d..4c0951fb 100644 --- a/common/web/src/test/kotlin/com/sangdol/common/web/support/log/WebLogMessageConverterTest.kt +++ b/common/web/src/test/kotlin/com/sangdol/common/web/support/log/WebLogMessageConverterTest.kt @@ -29,7 +29,7 @@ class WebLogMessageConverterTest : FunSpec({ beforeTest { method = "GET".also { every { servletRequest.method } returns it } requestUri = "/converter/test".also { every { servletRequest.requestURI } returns it } - remoteAddr = "localhost".also { every { servletRequest.remoteAddr } returns it } + remoteAddr = "localhost".also { every { servletRequest.remoteAddr } returns it } userAgent = "Mozilla/5.0".also { every { servletRequest.getHeader("User-Agent") } returns it } queryString = "key=value".also { every { servletRequest.queryString } returns it } } @@ -121,7 +121,10 @@ class WebLogMessageConverterTest : FunSpec({ this["duration_ms"].shouldNotBeNull() this["principal_id"] shouldBe principalId this["response_body"] shouldBe null - this["exception"] shouldBe mapOf("class" to exception.javaClass.simpleName, "message" to exception.message) + this["exception"] shouldBe mapOf( + "class" to exception.javaClass.simpleName, + "message" to exception.message + ) } } @@ -141,7 +144,10 @@ class WebLogMessageConverterTest : FunSpec({ this["duration_ms"].shouldNotBeNull() this["principal_id"] shouldBe principalId this["response_body"] shouldBe body - this["exception"] shouldBe mapOf("class" to exception.javaClass.simpleName, "message" to exception.message) + this["exception"] shouldBe mapOf( + "class" to exception.javaClass.simpleName, + "message" to exception.message + ) } } diff --git a/service/src/main/kotlin/com/sangdol/roomescape/admin/business/AdminService.kt b/service/src/main/kotlin/com/sangdol/roomescape/admin/business/AdminService.kt index 76fdf8a6..2c13e94b 100644 --- a/service/src/main/kotlin/com/sangdol/roomescape/admin/business/AdminService.kt +++ b/service/src/main/kotlin/com/sangdol/roomescape/admin/business/AdminService.kt @@ -1,11 +1,11 @@ package com.sangdol.roomescape.admin.business -import com.sangdol.roomescape.common.types.Auditor import com.sangdol.roomescape.admin.business.dto.AdminLoginCredentials import com.sangdol.roomescape.admin.business.dto.toCredentials import com.sangdol.roomescape.admin.exception.AdminErrorCode import com.sangdol.roomescape.admin.exception.AdminException import com.sangdol.roomescape.admin.infrastructure.persistence.AdminRepository +import com.sangdol.roomescape.common.types.Auditor import io.github.oshai.kotlinlogging.KLogger import io.github.oshai.kotlinlogging.KotlinLogging import org.springframework.data.repository.findByIdOrNull diff --git a/service/src/main/kotlin/com/sangdol/roomescape/auth/docs/AuthAPI.kt b/service/src/main/kotlin/com/sangdol/roomescape/auth/docs/AuthAPI.kt index 65a2c016..73fb472c 100644 --- a/service/src/main/kotlin/com/sangdol/roomescape/auth/docs/AuthAPI.kt +++ b/service/src/main/kotlin/com/sangdol/roomescape/auth/docs/AuthAPI.kt @@ -1,11 +1,11 @@ package com.sangdol.roomescape.auth.docs import com.sangdol.common.types.web.CommonApiResponse -import com.sangdol.roomescape.common.types.CurrentUserContext import com.sangdol.roomescape.auth.web.LoginRequest import com.sangdol.roomescape.auth.web.LoginSuccessResponse import com.sangdol.roomescape.auth.web.support.Public import com.sangdol.roomescape.auth.web.support.User +import com.sangdol.roomescape.common.types.CurrentUserContext import io.swagger.v3.oas.annotations.Operation import io.swagger.v3.oas.annotations.responses.ApiResponse import io.swagger.v3.oas.annotations.responses.ApiResponses diff --git a/service/src/main/kotlin/com/sangdol/roomescape/auth/exception/AuthErrorCode.kt b/service/src/main/kotlin/com/sangdol/roomescape/auth/exception/AuthErrorCode.kt index 2da82e04..bd659a01 100644 --- a/service/src/main/kotlin/com/sangdol/roomescape/auth/exception/AuthErrorCode.kt +++ b/service/src/main/kotlin/com/sangdol/roomescape/auth/exception/AuthErrorCode.kt @@ -1,7 +1,7 @@ package com.sangdol.roomescape.auth.exception -import com.sangdol.common.types.web.HttpStatus import com.sangdol.common.types.exception.ErrorCode +import com.sangdol.common.types.web.HttpStatus enum class AuthErrorCode( override val httpStatus: HttpStatus, diff --git a/service/src/main/kotlin/com/sangdol/roomescape/auth/infrastructure/jwt/JwtUtils.kt b/service/src/main/kotlin/com/sangdol/roomescape/auth/infrastructure/jwt/JwtUtils.kt index ba34b687..28be6c61 100644 --- a/service/src/main/kotlin/com/sangdol/roomescape/auth/infrastructure/jwt/JwtUtils.kt +++ b/service/src/main/kotlin/com/sangdol/roomescape/auth/infrastructure/jwt/JwtUtils.kt @@ -1,5 +1,7 @@ package com.sangdol.roomescape.auth.infrastructure.jwt +import com.sangdol.roomescape.auth.exception.AuthErrorCode +import com.sangdol.roomescape.auth.exception.AuthException import io.github.oshai.kotlinlogging.KLogger import io.github.oshai.kotlinlogging.KotlinLogging import io.jsonwebtoken.Claims @@ -8,8 +10,6 @@ import io.jsonwebtoken.Jwts import io.jsonwebtoken.security.Keys import org.springframework.beans.factory.annotation.Value import org.springframework.stereotype.Component -import com.sangdol.roomescape.auth.exception.AuthErrorCode -import com.sangdol.roomescape.auth.exception.AuthException import java.util.* import javax.crypto.SecretKey diff --git a/service/src/main/kotlin/com/sangdol/roomescape/auth/web/AuthDTO.kt b/service/src/main/kotlin/com/sangdol/roomescape/auth/web/AuthDTO.kt index 2069f004..4385358d 100644 --- a/service/src/main/kotlin/com/sangdol/roomescape/auth/web/AuthDTO.kt +++ b/service/src/main/kotlin/com/sangdol/roomescape/auth/web/AuthDTO.kt @@ -1,6 +1,5 @@ package com.sangdol.roomescape.auth.web -import com.sangdol.roomescape.admin.infrastructure.persistence.AdminType import jakarta.servlet.http.HttpServletRequest enum class PrincipalType { diff --git a/service/src/main/kotlin/com/sangdol/roomescape/auth/web/support/interceptors/AdminInterceptor.kt b/service/src/main/kotlin/com/sangdol/roomescape/auth/web/support/interceptors/AdminInterceptor.kt index 7de82394..9578dd35 100644 --- a/service/src/main/kotlin/com/sangdol/roomescape/auth/web/support/interceptors/AdminInterceptor.kt +++ b/service/src/main/kotlin/com/sangdol/roomescape/auth/web/support/interceptors/AdminInterceptor.kt @@ -1,12 +1,6 @@ package com.sangdol.roomescape.auth.web.support.interceptors -import io.github.oshai.kotlinlogging.KLogger -import io.github.oshai.kotlinlogging.KotlinLogging -import jakarta.servlet.http.HttpServletRequest -import jakarta.servlet.http.HttpServletResponse -import org.springframework.stereotype.Component -import org.springframework.web.method.HandlerMethod -import org.springframework.web.servlet.HandlerInterceptor +import com.sangdol.common.utils.MdcPrincipalIdUtil import com.sangdol.roomescape.admin.infrastructure.persistence.AdminPermissionLevel import com.sangdol.roomescape.admin.infrastructure.persistence.AdminType import com.sangdol.roomescape.admin.infrastructure.persistence.Privilege @@ -17,7 +11,13 @@ import com.sangdol.roomescape.auth.exception.AuthException import com.sangdol.roomescape.auth.infrastructure.jwt.JwtUtils import com.sangdol.roomescape.auth.web.support.AdminOnly import com.sangdol.roomescape.auth.web.support.accessToken -import com.sangdol.common.utils.MdcPrincipalIdUtil +import io.github.oshai.kotlinlogging.KLogger +import io.github.oshai.kotlinlogging.KotlinLogging +import jakarta.servlet.http.HttpServletRequest +import jakarta.servlet.http.HttpServletResponse +import org.springframework.stereotype.Component +import org.springframework.web.method.HandlerMethod +import org.springframework.web.servlet.HandlerInterceptor private val log: KLogger = KotlinLogging.logger {} @@ -47,7 +47,10 @@ class AdminInterceptor( return true } catch (e: Exception) { when (e) { - is AuthException -> { throw e } + is AuthException -> { + throw e + } + else -> { log.warn { "[AdminInterceptor] 예상치 못한 예외: message=${e.message}" } throw AuthException(AuthErrorCode.TEMPORARY_AUTH_ERROR) diff --git a/service/src/main/kotlin/com/sangdol/roomescape/auth/web/support/interceptors/UserInterceptor.kt b/service/src/main/kotlin/com/sangdol/roomescape/auth/web/support/interceptors/UserInterceptor.kt index 8be0d99c..c745681e 100644 --- a/service/src/main/kotlin/com/sangdol/roomescape/auth/web/support/interceptors/UserInterceptor.kt +++ b/service/src/main/kotlin/com/sangdol/roomescape/auth/web/support/interceptors/UserInterceptor.kt @@ -1,5 +1,12 @@ package com.sangdol.roomescape.auth.web.support.interceptors +import com.sangdol.common.utils.MdcPrincipalIdUtil +import com.sangdol.roomescape.auth.business.CLAIM_ADMIN_TYPE_KEY +import com.sangdol.roomescape.auth.exception.AuthErrorCode +import com.sangdol.roomescape.auth.exception.AuthException +import com.sangdol.roomescape.auth.infrastructure.jwt.JwtUtils +import com.sangdol.roomescape.auth.web.support.UserOnly +import com.sangdol.roomescape.auth.web.support.accessToken import io.github.oshai.kotlinlogging.KLogger import io.github.oshai.kotlinlogging.KotlinLogging import jakarta.servlet.http.HttpServletRequest @@ -7,13 +14,6 @@ import jakarta.servlet.http.HttpServletResponse import org.springframework.stereotype.Component import org.springframework.web.method.HandlerMethod import org.springframework.web.servlet.HandlerInterceptor -import com.sangdol.roomescape.auth.business.CLAIM_ADMIN_TYPE_KEY -import com.sangdol.roomescape.auth.exception.AuthErrorCode -import com.sangdol.roomescape.auth.exception.AuthException -import com.sangdol.roomescape.auth.infrastructure.jwt.JwtUtils -import com.sangdol.roomescape.auth.web.support.UserOnly -import com.sangdol.roomescape.auth.web.support.accessToken -import com.sangdol.common.utils.MdcPrincipalIdUtil private val log: KLogger = KotlinLogging.logger {} @@ -47,7 +47,10 @@ class UserInterceptor( return true } catch (e: Exception) { when (e) { - is AuthException -> { throw e } + is AuthException -> { + throw e + } + else -> { log.warn { "[UserInterceptor] 예상치 못한 예외: message=${e.message}" } throw AuthException(AuthErrorCode.TEMPORARY_AUTH_ERROR) diff --git a/service/src/main/kotlin/com/sangdol/roomescape/auth/web/support/resolver/UserContextResolver.kt b/service/src/main/kotlin/com/sangdol/roomescape/auth/web/support/resolver/UserContextResolver.kt index ea47d16b..e61270be 100644 --- a/service/src/main/kotlin/com/sangdol/roomescape/auth/web/support/resolver/UserContextResolver.kt +++ b/service/src/main/kotlin/com/sangdol/roomescape/auth/web/support/resolver/UserContextResolver.kt @@ -1,5 +1,11 @@ package com.sangdol.roomescape.auth.web.support.resolver +import com.sangdol.roomescape.auth.exception.AuthErrorCode +import com.sangdol.roomescape.auth.exception.AuthException +import com.sangdol.roomescape.auth.infrastructure.jwt.JwtUtils +import com.sangdol.roomescape.auth.web.support.User +import com.sangdol.roomescape.auth.web.support.accessToken +import com.sangdol.roomescape.user.business.UserService import io.github.oshai.kotlinlogging.KLogger import io.github.oshai.kotlinlogging.KotlinLogging import jakarta.servlet.http.HttpServletRequest @@ -9,12 +15,6 @@ import org.springframework.web.bind.support.WebDataBinderFactory import org.springframework.web.context.request.NativeWebRequest import org.springframework.web.method.support.HandlerMethodArgumentResolver import org.springframework.web.method.support.ModelAndViewContainer -import com.sangdol.roomescape.auth.exception.AuthErrorCode -import com.sangdol.roomescape.auth.exception.AuthException -import com.sangdol.roomescape.auth.infrastructure.jwt.JwtUtils -import com.sangdol.roomescape.auth.web.support.User -import com.sangdol.roomescape.auth.web.support.accessToken -import com.sangdol.roomescape.user.business.UserService private val log: KLogger = KotlinLogging.logger {} diff --git a/service/src/main/kotlin/com/sangdol/roomescape/common/config/RoomescapeLogMaskingConverter.kt b/service/src/main/kotlin/com/sangdol/roomescape/common/config/RoomescapeLogMaskingConverter.kt index 9e6c10e0..cf3ffa3d 100644 --- a/service/src/main/kotlin/com/sangdol/roomescape/common/config/RoomescapeLogMaskingConverter.kt +++ b/service/src/main/kotlin/com/sangdol/roomescape/common/config/RoomescapeLogMaskingConverter.kt @@ -1,9 +1,9 @@ package com.sangdol.roomescape.common.config -import com.sangdol.common.web.config.JacksonConfig import com.sangdol.common.log.message.AbstractLogMaskingConverter +import com.sangdol.common.web.config.JacksonConfig -class RoomescapeLogMaskingConverter: AbstractLogMaskingConverter( +class RoomescapeLogMaskingConverter : AbstractLogMaskingConverter( sensitiveKeys = setOf("password", "accessToken", "phone"), objectMapper = JacksonConfig().objectMapper() ) diff --git a/service/src/main/kotlin/com/sangdol/roomescape/common/config/SlowQueryLoggerConfig.kt b/service/src/main/kotlin/com/sangdol/roomescape/common/config/SlowQueryLoggerConfig.kt index 3ba7d7ae..6482d7c0 100644 --- a/service/src/main/kotlin/com/sangdol/roomescape/common/config/SlowQueryLoggerConfig.kt +++ b/service/src/main/kotlin/com/sangdol/roomescape/common/config/SlowQueryLoggerConfig.kt @@ -9,7 +9,6 @@ import org.springframework.boot.jdbc.DataSourceBuilder import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration import org.springframework.context.annotation.Primary -import org.springframework.context.annotation.Profile import javax.sql.DataSource @Configuration diff --git a/service/src/main/kotlin/com/sangdol/roomescape/common/config/SwaggerConfig.kt b/service/src/main/kotlin/com/sangdol/roomescape/common/config/SwaggerConfig.kt index 509a0192..1585f482 100644 --- a/service/src/main/kotlin/com/sangdol/roomescape/common/config/SwaggerConfig.kt +++ b/service/src/main/kotlin/com/sangdol/roomescape/common/config/SwaggerConfig.kt @@ -1,7 +1,6 @@ package com.sangdol.roomescape.common.config import io.swagger.v3.oas.models.OpenAPI -import io.swagger.v3.oas.models.info.Info import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration diff --git a/service/src/main/kotlin/com/sangdol/roomescape/common/config/WebMvcConfig.kt b/service/src/main/kotlin/com/sangdol/roomescape/common/config/WebMvcConfig.kt index 2bf615eb..1e64c387 100644 --- a/service/src/main/kotlin/com/sangdol/roomescape/common/config/WebMvcConfig.kt +++ b/service/src/main/kotlin/com/sangdol/roomescape/common/config/WebMvcConfig.kt @@ -1,12 +1,12 @@ package com.sangdol.roomescape.common.config +import com.sangdol.roomescape.auth.web.support.interceptors.AdminInterceptor +import com.sangdol.roomescape.auth.web.support.interceptors.UserInterceptor +import com.sangdol.roomescape.auth.web.support.resolver.UserContextResolver import org.springframework.context.annotation.Configuration import org.springframework.web.method.support.HandlerMethodArgumentResolver import org.springframework.web.servlet.config.annotation.InterceptorRegistry import org.springframework.web.servlet.config.annotation.WebMvcConfigurer -import com.sangdol.roomescape.auth.web.support.interceptors.AdminInterceptor -import com.sangdol.roomescape.auth.web.support.interceptors.UserInterceptor -import com.sangdol.roomescape.auth.web.support.resolver.UserContextResolver @Configuration class WebMvcConfig( diff --git a/service/src/main/kotlin/com/sangdol/roomescape/payment/business/PaymentService.kt b/service/src/main/kotlin/com/sangdol/roomescape/payment/business/PaymentService.kt index ecb24173..ec874e10 100644 --- a/service/src/main/kotlin/com/sangdol/roomescape/payment/business/PaymentService.kt +++ b/service/src/main/kotlin/com/sangdol/roomescape/payment/business/PaymentService.kt @@ -1,9 +1,5 @@ package com.sangdol.roomescape.payment.business -import io.github.oshai.kotlinlogging.KLogger -import io.github.oshai.kotlinlogging.KotlinLogging -import org.springframework.stereotype.Service -import org.springframework.transaction.annotation.Transactional import com.sangdol.common.persistence.TransactionExecutionUtil import com.sangdol.roomescape.payment.exception.PaymentErrorCode import com.sangdol.roomescape.payment.exception.PaymentException @@ -12,6 +8,10 @@ import com.sangdol.roomescape.payment.infrastructure.client.PaymentClientConfirm import com.sangdol.roomescape.payment.infrastructure.client.TosspayClient import com.sangdol.roomescape.payment.infrastructure.persistence.* import com.sangdol.roomescape.payment.web.* +import io.github.oshai.kotlinlogging.KLogger +import io.github.oshai.kotlinlogging.KotlinLogging +import org.springframework.stereotype.Service +import org.springframework.transaction.annotation.Transactional private val log: KLogger = KotlinLogging.logger {} diff --git a/service/src/main/kotlin/com/sangdol/roomescape/payment/exception/PaymentErrorCode.kt b/service/src/main/kotlin/com/sangdol/roomescape/payment/exception/PaymentErrorCode.kt index 9d2ea09a..db404e83 100644 --- a/service/src/main/kotlin/com/sangdol/roomescape/payment/exception/PaymentErrorCode.kt +++ b/service/src/main/kotlin/com/sangdol/roomescape/payment/exception/PaymentErrorCode.kt @@ -1,7 +1,7 @@ package com.sangdol.roomescape.payment.exception -import com.sangdol.common.types.web.HttpStatus import com.sangdol.common.types.exception.ErrorCode +import com.sangdol.common.types.web.HttpStatus enum class PaymentErrorCode( override val httpStatus: HttpStatus, diff --git a/service/src/main/kotlin/com/sangdol/roomescape/payment/infrastructure/common/PaymentTypes.kt b/service/src/main/kotlin/com/sangdol/roomescape/payment/infrastructure/common/PaymentTypes.kt index 44ef401f..5fd64a1d 100644 --- a/service/src/main/kotlin/com/sangdol/roomescape/payment/infrastructure/common/PaymentTypes.kt +++ b/service/src/main/kotlin/com/sangdol/roomescape/payment/infrastructure/common/PaymentTypes.kt @@ -1,10 +1,10 @@ package com.sangdol.roomescape.payment.infrastructure.common import com.fasterxml.jackson.annotation.JsonCreator -import io.github.oshai.kotlinlogging.KLogger -import io.github.oshai.kotlinlogging.KotlinLogging import com.sangdol.roomescape.payment.exception.PaymentErrorCode import com.sangdol.roomescape.payment.exception.PaymentException +import io.github.oshai.kotlinlogging.KLogger +import io.github.oshai.kotlinlogging.KotlinLogging private val log: KLogger = KotlinLogging.logger {} diff --git a/service/src/main/kotlin/com/sangdol/roomescape/region/business/RegionService.kt b/service/src/main/kotlin/com/sangdol/roomescape/region/business/RegionService.kt index 2e337f9d..8da6c9fe 100644 --- a/service/src/main/kotlin/com/sangdol/roomescape/region/business/RegionService.kt +++ b/service/src/main/kotlin/com/sangdol/roomescape/region/business/RegionService.kt @@ -1,13 +1,13 @@ package com.sangdol.roomescape.region.business -import io.github.oshai.kotlinlogging.KLogger -import io.github.oshai.kotlinlogging.KotlinLogging -import org.springframework.stereotype.Service -import org.springframework.transaction.annotation.Transactional import com.sangdol.roomescape.region.exception.RegionErrorCode import com.sangdol.roomescape.region.exception.RegionException import com.sangdol.roomescape.region.infrastructure.persistence.RegionRepository import com.sangdol.roomescape.region.web.* +import io.github.oshai.kotlinlogging.KLogger +import io.github.oshai.kotlinlogging.KotlinLogging +import org.springframework.stereotype.Service +import org.springframework.transaction.annotation.Transactional private val log: KLogger = KotlinLogging.logger {} diff --git a/service/src/main/kotlin/com/sangdol/roomescape/region/exception/RegionException.kt b/service/src/main/kotlin/com/sangdol/roomescape/region/exception/RegionException.kt index b7201c9b..9872add4 100644 --- a/service/src/main/kotlin/com/sangdol/roomescape/region/exception/RegionException.kt +++ b/service/src/main/kotlin/com/sangdol/roomescape/region/exception/RegionException.kt @@ -1,8 +1,8 @@ package com.sangdol.roomescape.region.exception -import com.sangdol.common.types.web.HttpStatus import com.sangdol.common.types.exception.ErrorCode import com.sangdol.common.types.exception.RoomescapeException +import com.sangdol.common.types.web.HttpStatus class RegionException( override val errorCode: RegionErrorCode, diff --git a/service/src/main/kotlin/com/sangdol/roomescape/reservation/business/ReservationValidator.kt b/service/src/main/kotlin/com/sangdol/roomescape/reservation/business/ReservationValidator.kt index d8211272..84fea83b 100644 --- a/service/src/main/kotlin/com/sangdol/roomescape/reservation/business/ReservationValidator.kt +++ b/service/src/main/kotlin/com/sangdol/roomescape/reservation/business/ReservationValidator.kt @@ -1,14 +1,14 @@ package com.sangdol.roomescape.reservation.business -import io.github.oshai.kotlinlogging.KLogger -import io.github.oshai.kotlinlogging.KotlinLogging -import org.springframework.stereotype.Component import com.sangdol.roomescape.reservation.exception.ReservationErrorCode import com.sangdol.roomescape.reservation.exception.ReservationException import com.sangdol.roomescape.reservation.web.PendingReservationCreateRequest import com.sangdol.roomescape.schedule.infrastructure.persistence.ScheduleStatus import com.sangdol.roomescape.schedule.web.ScheduleSummaryResponse import com.sangdol.roomescape.theme.web.ThemeInfoResponse +import io.github.oshai.kotlinlogging.KLogger +import io.github.oshai.kotlinlogging.KotlinLogging +import org.springframework.stereotype.Component private val log: KLogger = KotlinLogging.logger {} diff --git a/service/src/main/kotlin/com/sangdol/roomescape/reservation/docs/ReservationAPI.kt b/service/src/main/kotlin/com/sangdol/roomescape/reservation/docs/ReservationAPI.kt index 2d53eecf..89191484 100644 --- a/service/src/main/kotlin/com/sangdol/roomescape/reservation/docs/ReservationAPI.kt +++ b/service/src/main/kotlin/com/sangdol/roomescape/reservation/docs/ReservationAPI.kt @@ -1,9 +1,9 @@ package com.sangdol.roomescape.reservation.docs import com.sangdol.common.types.web.CommonApiResponse -import com.sangdol.roomescape.common.types.CurrentUserContext import com.sangdol.roomescape.auth.web.support.User import com.sangdol.roomescape.auth.web.support.UserOnly +import com.sangdol.roomescape.common.types.CurrentUserContext import com.sangdol.roomescape.reservation.web.* import io.swagger.v3.oas.annotations.Operation import io.swagger.v3.oas.annotations.responses.ApiResponse diff --git a/service/src/main/kotlin/com/sangdol/roomescape/reservation/exception/ReservationErrorCode.kt b/service/src/main/kotlin/com/sangdol/roomescape/reservation/exception/ReservationErrorCode.kt index 1e0b3829..82158113 100644 --- a/service/src/main/kotlin/com/sangdol/roomescape/reservation/exception/ReservationErrorCode.kt +++ b/service/src/main/kotlin/com/sangdol/roomescape/reservation/exception/ReservationErrorCode.kt @@ -1,7 +1,7 @@ package com.sangdol.roomescape.reservation.exception -import com.sangdol.common.types.web.HttpStatus import com.sangdol.common.types.exception.ErrorCode +import com.sangdol.common.types.web.HttpStatus enum class ReservationErrorCode( override val httpStatus: HttpStatus, diff --git a/service/src/main/kotlin/com/sangdol/roomescape/reservation/infrastructure/persistence/ReservationRepository.kt b/service/src/main/kotlin/com/sangdol/roomescape/reservation/infrastructure/persistence/ReservationRepository.kt index ef5fcc80..7d1827f9 100644 --- a/service/src/main/kotlin/com/sangdol/roomescape/reservation/infrastructure/persistence/ReservationRepository.kt +++ b/service/src/main/kotlin/com/sangdol/roomescape/reservation/infrastructure/persistence/ReservationRepository.kt @@ -11,7 +11,8 @@ interface ReservationRepository : JpaRepository { fun findAllByUserIdAndStatusIsIn(userId: Long, statuses: List): List @Modifying - @Query(""" + @Query( + """ UPDATE reservation r JOIN @@ -23,6 +24,7 @@ interface ReservationRepository : JpaRepository { s.hold_expired_at = NULL WHERE r.status = 'PENDING' AND r.created_at <= DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 5 MINUTE) - """, nativeQuery = true) + """, nativeQuery = true + ) fun expirePendingReservations(@Param("now") now: Instant): Int } diff --git a/service/src/main/kotlin/com/sangdol/roomescape/reservation/web/ReservationController.kt b/service/src/main/kotlin/com/sangdol/roomescape/reservation/web/ReservationController.kt index b218ea2b..1a545826 100644 --- a/service/src/main/kotlin/com/sangdol/roomescape/reservation/web/ReservationController.kt +++ b/service/src/main/kotlin/com/sangdol/roomescape/reservation/web/ReservationController.kt @@ -1,8 +1,8 @@ package com.sangdol.roomescape.reservation.web import com.sangdol.common.types.web.CommonApiResponse -import com.sangdol.roomescape.common.types.CurrentUserContext import com.sangdol.roomescape.auth.web.support.User +import com.sangdol.roomescape.common.types.CurrentUserContext import com.sangdol.roomescape.reservation.business.ReservationService import com.sangdol.roomescape.reservation.docs.ReservationAPI import jakarta.validation.Valid diff --git a/service/src/main/kotlin/com/sangdol/roomescape/schedule/business/ScheduleService.kt b/service/src/main/kotlin/com/sangdol/roomescape/schedule/business/ScheduleService.kt index 685b33a6..95be6d49 100644 --- a/service/src/main/kotlin/com/sangdol/roomescape/schedule/business/ScheduleService.kt +++ b/service/src/main/kotlin/com/sangdol/roomescape/schedule/business/ScheduleService.kt @@ -57,7 +57,7 @@ class ScheduleService( val schedules: List = scheduleRepository.findStoreSchedulesWithThemeByDate(storeId, date) - .filter { it.time.isAfter(currentTime) } + .filter { it.date.isAfter(currentDate) || it.time.isAfter(currentTime) } return schedules.toResponse() .also { diff --git a/service/src/main/kotlin/com/sangdol/roomescape/schedule/docs/ScheduleAPI.kt b/service/src/main/kotlin/com/sangdol/roomescape/schedule/docs/ScheduleAPI.kt index 9e2c4ea7..dfbd397e 100644 --- a/service/src/main/kotlin/com/sangdol/roomescape/schedule/docs/ScheduleAPI.kt +++ b/service/src/main/kotlin/com/sangdol/roomescape/schedule/docs/ScheduleAPI.kt @@ -1,12 +1,12 @@ package com.sangdol.roomescape.schedule.docs -import com.sangdol.roomescape.common.types.AuditingInfo import com.sangdol.common.types.web.CommonApiResponse import com.sangdol.roomescape.admin.infrastructure.persistence.AdminType import com.sangdol.roomescape.admin.infrastructure.persistence.Privilege import com.sangdol.roomescape.auth.web.support.AdminOnly import com.sangdol.roomescape.auth.web.support.Public import com.sangdol.roomescape.auth.web.support.UserOnly +import com.sangdol.roomescape.common.types.AuditingInfo import com.sangdol.roomescape.schedule.web.* import io.swagger.v3.oas.annotations.Operation import io.swagger.v3.oas.annotations.responses.ApiResponse diff --git a/service/src/main/kotlin/com/sangdol/roomescape/schedule/exception/ScheduleErrorCode.kt b/service/src/main/kotlin/com/sangdol/roomescape/schedule/exception/ScheduleErrorCode.kt index 0194f2fa..fd772285 100644 --- a/service/src/main/kotlin/com/sangdol/roomescape/schedule/exception/ScheduleErrorCode.kt +++ b/service/src/main/kotlin/com/sangdol/roomescape/schedule/exception/ScheduleErrorCode.kt @@ -1,7 +1,7 @@ package com.sangdol.roomescape.schedule.exception -import com.sangdol.common.types.web.HttpStatus import com.sangdol.common.types.exception.ErrorCode +import com.sangdol.common.types.web.HttpStatus enum class ScheduleErrorCode( override val httpStatus: HttpStatus, diff --git a/service/src/main/kotlin/com/sangdol/roomescape/schedule/infrastructure/persistence/ScheduleRepository.kt b/service/src/main/kotlin/com/sangdol/roomescape/schedule/infrastructure/persistence/ScheduleRepository.kt index 623c564b..87a38a58 100644 --- a/service/src/main/kotlin/com/sangdol/roomescape/schedule/infrastructure/persistence/ScheduleRepository.kt +++ b/service/src/main/kotlin/com/sangdol/roomescape/schedule/infrastructure/persistence/ScheduleRepository.kt @@ -14,14 +14,16 @@ import java.time.LocalTime interface ScheduleRepository : JpaRepository { @Lock(value = LockModeType.PESSIMISTIC_WRITE) - @Query(""" + @Query( + """ SELECT s FROM ScheduleEntity s WHERE s._id = :id - """) + """ + ) fun findByIdForUpdate(id: Long): ScheduleEntity? @Query( @@ -117,7 +119,12 @@ interface ScheduleRepository : JpaRepository { s.status = :currentStatus """ ) - fun changeStatus(id: Long, currentStatus: ScheduleStatus, changeStatus: ScheduleStatus, expiredAt: Instant = Instant.now().plusSeconds(5 * 60)): Int + fun changeStatus( + id: Long, + currentStatus: ScheduleStatus, + changeStatus: ScheduleStatus, + expiredAt: Instant = Instant.now().plusSeconds(5 * 60) + ): Int @Modifying @Query( diff --git a/service/src/main/kotlin/com/sangdol/roomescape/schedule/web/AdminScheduleController.kt b/service/src/main/kotlin/com/sangdol/roomescape/schedule/web/AdminScheduleController.kt index 3c7b89d4..54a38e6c 100644 --- a/service/src/main/kotlin/com/sangdol/roomescape/schedule/web/AdminScheduleController.kt +++ b/service/src/main/kotlin/com/sangdol/roomescape/schedule/web/AdminScheduleController.kt @@ -1,7 +1,7 @@ package com.sangdol.roomescape.schedule.web -import com.sangdol.roomescape.common.types.AuditingInfo import com.sangdol.common.types.web.CommonApiResponse +import com.sangdol.roomescape.common.types.AuditingInfo import com.sangdol.roomescape.schedule.business.ScheduleService import com.sangdol.roomescape.schedule.docs.AdminScheduleAPI import jakarta.validation.Valid diff --git a/service/src/main/kotlin/com/sangdol/roomescape/store/business/StoreService.kt b/service/src/main/kotlin/com/sangdol/roomescape/store/business/StoreService.kt index 55753754..4271767f 100644 --- a/service/src/main/kotlin/com/sangdol/roomescape/store/business/StoreService.kt +++ b/service/src/main/kotlin/com/sangdol/roomescape/store/business/StoreService.kt @@ -1,8 +1,8 @@ package com.sangdol.roomescape.store.business import com.sangdol.common.persistence.IDGenerator -import com.sangdol.roomescape.common.types.AuditingInfo import com.sangdol.roomescape.admin.business.AdminService +import com.sangdol.roomescape.common.types.AuditingInfo import com.sangdol.roomescape.region.business.RegionService import com.sangdol.roomescape.store.exception.StoreErrorCode import com.sangdol.roomescape.store.exception.StoreException diff --git a/service/src/main/kotlin/com/sangdol/roomescape/store/business/StoreValidator.kt b/service/src/main/kotlin/com/sangdol/roomescape/store/business/StoreValidator.kt index cd1f3f69..65d5708e 100644 --- a/service/src/main/kotlin/com/sangdol/roomescape/store/business/StoreValidator.kt +++ b/service/src/main/kotlin/com/sangdol/roomescape/store/business/StoreValidator.kt @@ -1,13 +1,13 @@ package com.sangdol.roomescape.store.business -import io.github.oshai.kotlinlogging.KLogger -import io.github.oshai.kotlinlogging.KotlinLogging -import org.springframework.stereotype.Component import com.sangdol.roomescape.store.exception.StoreErrorCode import com.sangdol.roomescape.store.exception.StoreException import com.sangdol.roomescape.store.infrastructure.persistence.StoreRepository import com.sangdol.roomescape.store.web.StoreRegisterRequest import com.sangdol.roomescape.store.web.StoreUpdateRequest +import io.github.oshai.kotlinlogging.KLogger +import io.github.oshai.kotlinlogging.KotlinLogging +import org.springframework.stereotype.Component private val log: KLogger = KotlinLogging.logger {} diff --git a/service/src/main/kotlin/com/sangdol/roomescape/store/exception/StoreException.kt b/service/src/main/kotlin/com/sangdol/roomescape/store/exception/StoreException.kt index fad3d383..5e55b3b1 100644 --- a/service/src/main/kotlin/com/sangdol/roomescape/store/exception/StoreException.kt +++ b/service/src/main/kotlin/com/sangdol/roomescape/store/exception/StoreException.kt @@ -1,8 +1,8 @@ package com.sangdol.roomescape.store.exception -import com.sangdol.common.types.web.HttpStatus import com.sangdol.common.types.exception.ErrorCode import com.sangdol.common.types.exception.RoomescapeException +import com.sangdol.common.types.web.HttpStatus class StoreException( override val errorCode: StoreErrorCode, diff --git a/service/src/main/kotlin/com/sangdol/roomescape/theme/business/ThemeValidator.kt b/service/src/main/kotlin/com/sangdol/roomescape/theme/business/ThemeValidator.kt index 8d5b341f..e8a362f4 100644 --- a/service/src/main/kotlin/com/sangdol/roomescape/theme/business/ThemeValidator.kt +++ b/service/src/main/kotlin/com/sangdol/roomescape/theme/business/ThemeValidator.kt @@ -1,13 +1,13 @@ package com.sangdol.roomescape.theme.business -import io.github.oshai.kotlinlogging.KLogger -import io.github.oshai.kotlinlogging.KotlinLogging -import org.springframework.stereotype.Component import com.sangdol.roomescape.theme.exception.ThemeErrorCode import com.sangdol.roomescape.theme.exception.ThemeException import com.sangdol.roomescape.theme.infrastructure.persistence.ThemeRepository import com.sangdol.roomescape.theme.web.ThemeCreateRequest import com.sangdol.roomescape.theme.web.ThemeUpdateRequest +import io.github.oshai.kotlinlogging.KLogger +import io.github.oshai.kotlinlogging.KotlinLogging +import org.springframework.stereotype.Component private val log: KLogger = KotlinLogging.logger {} diff --git a/service/src/main/kotlin/com/sangdol/roomescape/theme/exception/ThemeErrorCode.kt b/service/src/main/kotlin/com/sangdol/roomescape/theme/exception/ThemeErrorCode.kt index 03673549..11bd9fa4 100644 --- a/service/src/main/kotlin/com/sangdol/roomescape/theme/exception/ThemeErrorCode.kt +++ b/service/src/main/kotlin/com/sangdol/roomescape/theme/exception/ThemeErrorCode.kt @@ -1,7 +1,7 @@ package com.sangdol.roomescape.theme.exception -import com.sangdol.common.types.web.HttpStatus import com.sangdol.common.types.exception.ErrorCode +import com.sangdol.common.types.web.HttpStatus enum class ThemeErrorCode( override val httpStatus: HttpStatus, diff --git a/service/src/main/kotlin/com/sangdol/roomescape/theme/infrastructure/persistence/ThemeRepository.kt b/service/src/main/kotlin/com/sangdol/roomescape/theme/infrastructure/persistence/ThemeRepository.kt index 644f84b6..cef38dff 100644 --- a/service/src/main/kotlin/com/sangdol/roomescape/theme/infrastructure/persistence/ThemeRepository.kt +++ b/service/src/main/kotlin/com/sangdol/roomescape/theme/infrastructure/persistence/ThemeRepository.kt @@ -1,8 +1,8 @@ package com.sangdol.roomescape.theme.infrastructure.persistence +import com.sangdol.roomescape.theme.business.domain.ThemeInfo import org.springframework.data.jpa.repository.JpaRepository import org.springframework.data.jpa.repository.Query -import com.sangdol.roomescape.theme.business.domain.ThemeInfo import java.time.LocalDate interface ThemeRepository : JpaRepository { diff --git a/service/src/main/kotlin/com/sangdol/roomescape/user/business/UserService.kt b/service/src/main/kotlin/com/sangdol/roomescape/user/business/UserService.kt index 9e92784f..e84a49ce 100644 --- a/service/src/main/kotlin/com/sangdol/roomescape/user/business/UserService.kt +++ b/service/src/main/kotlin/com/sangdol/roomescape/user/business/UserService.kt @@ -55,7 +55,7 @@ class UserService( } @Transactional(readOnly = true) - fun findContactById(id: Long) : UserContactResponse { + fun findContactById(id: Long): UserContactResponse { log.info { "[findContactById] 회원 연락 정보 조회 시작: id=${id}" } val user = findOrThrow(id) diff --git a/service/src/main/kotlin/com/sangdol/roomescape/user/business/UserValidator.kt b/service/src/main/kotlin/com/sangdol/roomescape/user/business/UserValidator.kt index 400ff17d..ff7a4ec6 100644 --- a/service/src/main/kotlin/com/sangdol/roomescape/user/business/UserValidator.kt +++ b/service/src/main/kotlin/com/sangdol/roomescape/user/business/UserValidator.kt @@ -1,11 +1,11 @@ package com.sangdol.roomescape.user.business -import io.github.oshai.kotlinlogging.KLogger -import io.github.oshai.kotlinlogging.KotlinLogging -import org.springframework.stereotype.Component import com.sangdol.roomescape.user.exception.UserErrorCode import com.sangdol.roomescape.user.exception.UserException import com.sangdol.roomescape.user.infrastructure.persistence.UserRepository +import io.github.oshai.kotlinlogging.KLogger +import io.github.oshai.kotlinlogging.KotlinLogging +import org.springframework.stereotype.Component private val log: KLogger = KotlinLogging.logger {} diff --git a/service/src/main/kotlin/com/sangdol/roomescape/user/exception/UserException.kt b/service/src/main/kotlin/com/sangdol/roomescape/user/exception/UserException.kt index 05f4963a..c1d0c589 100644 --- a/service/src/main/kotlin/com/sangdol/roomescape/user/exception/UserException.kt +++ b/service/src/main/kotlin/com/sangdol/roomescape/user/exception/UserException.kt @@ -1,8 +1,8 @@ package com.sangdol.roomescape.user.exception -import com.sangdol.common.types.web.HttpStatus import com.sangdol.common.types.exception.ErrorCode import com.sangdol.common.types.exception.RoomescapeException +import com.sangdol.common.types.web.HttpStatus class UserException( override val errorCode: UserErrorCode, diff --git a/service/src/main/kotlin/com/sangdol/roomescape/user/infrastructure/persistence/UserEntities.kt b/service/src/main/kotlin/com/sangdol/roomescape/user/infrastructure/persistence/UserEntities.kt index 89d3c1fc..291a4402 100644 --- a/service/src/main/kotlin/com/sangdol/roomescape/user/infrastructure/persistence/UserEntities.kt +++ b/service/src/main/kotlin/com/sangdol/roomescape/user/infrastructure/persistence/UserEntities.kt @@ -22,7 +22,7 @@ class UserEntity( @Enumerated(value = EnumType.STRING) var status: UserStatus -): AuditingBaseEntity(id) +) : AuditingBaseEntity(id) @Entity @Table(name = "user_status_history") diff --git a/service/src/main/kotlin/com/sangdol/roomescape/user/web/UserDTO.kt b/service/src/main/kotlin/com/sangdol/roomescape/user/web/UserDTO.kt index 4e300475..d77e3ba0 100644 --- a/service/src/main/kotlin/com/sangdol/roomescape/user/web/UserDTO.kt +++ b/service/src/main/kotlin/com/sangdol/roomescape/user/web/UserDTO.kt @@ -1,11 +1,11 @@ package com.sangdol.roomescape.user.web +import com.sangdol.roomescape.user.infrastructure.persistence.UserEntity +import com.sangdol.roomescape.user.infrastructure.persistence.UserStatus import jakarta.validation.constraints.Email import jakarta.validation.constraints.NotEmpty import jakarta.validation.constraints.Pattern import jakarta.validation.constraints.Size -import com.sangdol.roomescape.user.infrastructure.persistence.UserEntity -import com.sangdol.roomescape.user.infrastructure.persistence.UserStatus const val MIN_PASSWORD_LENGTH = 8 diff --git a/service/src/test/kotlin/com/sangdol/data/DefaultDataInitializer.kt b/service/src/test/kotlin/com/sangdol/data/DefaultDataInitializer.kt index 8ee9b99f..6ba28855 100644 --- a/service/src/test/kotlin/com/sangdol/data/DefaultDataInitializer.kt +++ b/service/src/test/kotlin/com/sangdol/data/DefaultDataInitializer.kt @@ -494,8 +494,16 @@ class ScheduleDataInitializer : AbstractDataInitializer() { val storeAdminId = store.second batchArgs.add( arrayOf( - idGenerator.create(), storeId, theme.id, themeCreatedDate, time, - status, storeAdminId, storeAdminId, themeCreatedTime.plusHours(1), themeCreatedTime.plusHours(1) + idGenerator.create(), + storeId, + theme.id, + themeCreatedDate, + time, + status, + storeAdminId, + storeAdminId, + themeCreatedTime.plusHours(1), + themeCreatedTime.plusHours(1) ) ) @@ -631,7 +639,8 @@ data class PaymentWithMethods( class PaymentDataInitializer : AbstractDataInitializer() { companion object { val requestedAtCache: Timestamp = Timestamp.valueOf(KoreaDateTime.nowWithOffset().toLocalDateTime()) - val approvedAtCache: Timestamp = Timestamp.valueOf(KoreaDateTime.nowWithOffset().plusSeconds(5).toLocalDateTime()) + val approvedAtCache: Timestamp = + Timestamp.valueOf(KoreaDateTime.nowWithOffset().plusSeconds(5).toLocalDateTime()) val supportedPaymentMethods = listOf(PaymentMethod.TRANSFER, PaymentMethod.EASY_PAY, PaymentMethod.CARD) val supportedCardType = listOf(CardType.CREDIT, CardType.CHECK) @@ -850,7 +859,10 @@ class PaymentDataInitializer : AbstractDataInitializer() { executeBatch(paymentCardDetailSql, cardBatchArgs).also { cardBatchArgs.clear() } } if (easypayPrepaidBatchArgs.isNotEmpty()) { - executeBatch(paymentEasypayPrepaidDetailSql, easypayPrepaidBatchArgs).also { easypayPrepaidBatchArgs.clear() } + executeBatch( + paymentEasypayPrepaidDetailSql, + easypayPrepaidBatchArgs + ).also { easypayPrepaidBatchArgs.clear() } } } diff --git a/service/src/test/kotlin/com/sangdol/data/PopulationDataParser.kt b/service/src/test/kotlin/com/sangdol/data/PopulationDataParser.kt index cfd6d592..784a518e 100644 --- a/service/src/test/kotlin/com/sangdol/data/PopulationDataParser.kt +++ b/service/src/test/kotlin/com/sangdol/data/PopulationDataParser.kt @@ -129,7 +129,12 @@ class StoreDataInitializer { val randomPositiveWord = positiveWords.random() storeName = "${parseSigunguName(region.sigunguName)}${randomPositiveWord}점" address = - "${region.sidoName} ${region.sigunguName} ${randomPositiveWord}${Random.nextInt(1, 10)}길 ${Random.nextInt(1, 100)}" + "${region.sidoName} ${region.sigunguName} ${randomPositiveWord}${ + Random.nextInt( + 1, + 10 + ) + }길 ${Random.nextInt(1, 100)}" } while (usedStoreName.contains(storeName)) usedStoreName.add(storeName) @@ -158,13 +163,17 @@ class StoreDataInitializer { } File("$BASE_DIR/store_data.txt").also { - if (it.exists()) { it.delete() } + if (it.exists()) { + it.delete() + } }.writeText( storeDataRows.joinToString("\n") ) return File("$BASE_DIR/store_data.sql").also { - if (it.exists()) { it.delete() } + if (it.exists()) { + it.delete() + } StringBuilder("INSERT INTO store (id, name, address, contact, business_reg_num, region_code, status, created_at, created_by, updated_at, updated_by) VALUES ") .append(storeSqlRows.joinToString(",\n")) diff --git a/service/src/test/kotlin/com/sangdol/roomescape/auth/AuthApiTest.kt b/service/src/test/kotlin/com/sangdol/roomescape/auth/AuthApiTest.kt index c69695f1..913bdf30 100644 --- a/service/src/test/kotlin/com/sangdol/roomescape/auth/AuthApiTest.kt +++ b/service/src/test/kotlin/com/sangdol/roomescape/auth/AuthApiTest.kt @@ -1,13 +1,6 @@ package com.sangdol.roomescape.auth import com.ninjasquad.springmockk.SpykBean -import io.kotest.assertions.assertSoftly -import io.kotest.matchers.collections.shouldHaveSize -import io.kotest.matchers.shouldBe -import io.kotest.matchers.shouldNotBe -import io.mockk.every -import io.restassured.response.ValidatableResponse -import org.hamcrest.CoreMatchers.equalTo import com.sangdol.common.types.web.HttpStatus import com.sangdol.roomescape.admin.exception.AdminErrorCode import com.sangdol.roomescape.auth.business.CLAIM_ADMIN_TYPE_KEY @@ -24,6 +17,13 @@ import com.sangdol.roomescape.supports.UserFixture import com.sangdol.roomescape.supports.runTest import com.sangdol.roomescape.user.exception.UserErrorCode import com.sangdol.roomescape.user.infrastructure.persistence.UserEntity +import io.kotest.assertions.assertSoftly +import io.kotest.matchers.collections.shouldHaveSize +import io.kotest.matchers.shouldBe +import io.kotest.matchers.shouldNotBe +import io.mockk.every +import io.restassured.response.ValidatableResponse +import org.hamcrest.CoreMatchers.equalTo class AuthApiTest( @SpykBean private val jwtUtils: JwtUtils, diff --git a/service/src/test/kotlin/com/sangdol/roomescape/auth/FailOnSaveLoginHistoryTest.kt b/service/src/test/kotlin/com/sangdol/roomescape/auth/FailOnSaveLoginHistoryTest.kt index 16d616f3..fb86ab54 100644 --- a/service/src/test/kotlin/com/sangdol/roomescape/auth/FailOnSaveLoginHistoryTest.kt +++ b/service/src/test/kotlin/com/sangdol/roomescape/auth/FailOnSaveLoginHistoryTest.kt @@ -1,8 +1,6 @@ package com.sangdol.roomescape.auth import com.ninjasquad.springmockk.MockkBean -import io.mockk.clearMocks -import io.mockk.every import com.sangdol.common.types.web.HttpStatus import com.sangdol.roomescape.auth.infrastructure.persistence.LoginHistoryRepository import com.sangdol.roomescape.auth.web.LoginRequest @@ -11,6 +9,8 @@ import com.sangdol.roomescape.supports.AdminFixture import com.sangdol.roomescape.supports.FunSpecSpringbootTest import com.sangdol.roomescape.supports.UserFixture import com.sangdol.roomescape.supports.runTest +import io.mockk.clearMocks +import io.mockk.every class FailOnSaveLoginHistoryTest( @MockkBean private val loginHistoryRepository: LoginHistoryRepository diff --git a/service/src/test/kotlin/com/sangdol/roomescape/payment/PaymentAPITest.kt b/service/src/test/kotlin/com/sangdol/roomescape/payment/PaymentAPITest.kt index fc5cc0d5..119d3a84 100644 --- a/service/src/test/kotlin/com/sangdol/roomescape/payment/PaymentAPITest.kt +++ b/service/src/test/kotlin/com/sangdol/roomescape/payment/PaymentAPITest.kt @@ -1,10 +1,6 @@ package com.sangdol.roomescape.payment import com.ninjasquad.springmockk.MockkBean -import io.kotest.matchers.shouldBe -import io.mockk.every -import org.springframework.data.repository.findByIdOrNull -import org.springframework.http.HttpMethod import com.sangdol.common.types.web.HttpStatus import com.sangdol.roomescape.auth.exception.AuthErrorCode import com.sangdol.roomescape.payment.business.PaymentService @@ -18,6 +14,10 @@ import com.sangdol.roomescape.payment.infrastructure.persistence.* import com.sangdol.roomescape.payment.web.PaymentConfirmRequest import com.sangdol.roomescape.payment.web.PaymentCreateResponse import com.sangdol.roomescape.supports.* +import io.kotest.matchers.shouldBe +import io.mockk.every +import org.springframework.data.repository.findByIdOrNull +import org.springframework.http.HttpMethod class PaymentAPITest( @MockkBean diff --git a/service/src/test/kotlin/com/sangdol/roomescape/payment/PaymentTypeTest.kt b/service/src/test/kotlin/com/sangdol/roomescape/payment/PaymentTypeTest.kt index 5831bc95..5f3c95ff 100644 --- a/service/src/test/kotlin/com/sangdol/roomescape/payment/PaymentTypeTest.kt +++ b/service/src/test/kotlin/com/sangdol/roomescape/payment/PaymentTypeTest.kt @@ -2,14 +2,7 @@ package com.sangdol.roomescape.payment import com.sangdol.roomescape.payment.exception.PaymentErrorCode import com.sangdol.roomescape.payment.exception.PaymentException -import com.sangdol.roomescape.payment.infrastructure.common.BankCode -import com.sangdol.roomescape.payment.infrastructure.common.CardIssuerCode -import com.sangdol.roomescape.payment.infrastructure.common.CardOwnerType -import com.sangdol.roomescape.payment.infrastructure.common.CardType -import com.sangdol.roomescape.payment.infrastructure.common.EasyPayCompanyCode -import com.sangdol.roomescape.payment.infrastructure.common.PaymentMethod -import com.sangdol.roomescape.payment.infrastructure.common.PaymentStatus -import com.sangdol.roomescape.payment.infrastructure.common.PaymentType +import com.sangdol.roomescape.payment.infrastructure.common.* import io.kotest.assertions.assertSoftly import io.kotest.core.spec.style.FunSpec import io.kotest.matchers.shouldBe diff --git a/service/src/test/kotlin/com/sangdol/roomescape/payment/SampleTosspayConstant.kt b/service/src/test/kotlin/com/sangdol/roomescape/payment/SampleTosspayConstant.kt index b75bb0d7..d8170312 100644 --- a/service/src/test/kotlin/com/sangdol/roomescape/payment/SampleTosspayConstant.kt +++ b/service/src/test/kotlin/com/sangdol/roomescape/payment/SampleTosspayConstant.kt @@ -1,7 +1,6 @@ package com.sangdol.roomescape.payment import com.sangdol.common.utils.KoreaDateTime -import java.time.OffsetDateTime object SampleTosspayConstant { const val PAYMENT_KEY: String = "5EnNZRJGvaBX7zk2yd8ydw26XvwXkLrx9POLqKQjmAw4b0e1" diff --git a/service/src/test/kotlin/com/sangdol/roomescape/payment/TosspayClientTest.kt b/service/src/test/kotlin/com/sangdol/roomescape/payment/TosspayClientTest.kt index 1373d22a..6ad61b04 100644 --- a/service/src/test/kotlin/com/sangdol/roomescape/payment/TosspayClientTest.kt +++ b/service/src/test/kotlin/com/sangdol/roomescape/payment/TosspayClientTest.kt @@ -1,6 +1,12 @@ package com.sangdol.roomescape.payment import com.ninjasquad.springmockk.MockkBean +import com.sangdol.roomescape.payment.exception.PaymentErrorCode +import com.sangdol.roomescape.payment.exception.PaymentException +import com.sangdol.roomescape.payment.infrastructure.client.PaymentClientCancelResponse +import com.sangdol.roomescape.payment.infrastructure.client.PaymentClientConfirmResponse +import com.sangdol.roomescape.payment.infrastructure.client.TosspayClient +import com.sangdol.roomescape.payment.infrastructure.common.PaymentStatus import io.kotest.assertions.assertSoftly import io.kotest.assertions.throwables.shouldThrow import io.kotest.core.spec.style.FunSpec @@ -9,19 +15,13 @@ import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.test.autoconfigure.web.client.RestClientTest import org.springframework.data.jpa.mapping.JpaMetamodelMappingContext import org.springframework.http.HttpMethod +import org.springframework.http.HttpStatus import org.springframework.http.MediaType import org.springframework.test.web.client.MockRestServiceServer import org.springframework.test.web.client.ResponseActions import org.springframework.test.web.client.match.MockRestRequestMatchers.* import org.springframework.test.web.client.response.MockRestResponseCreators.withStatus import org.springframework.test.web.client.response.MockRestResponseCreators.withSuccess -import com.sangdol.roomescape.payment.exception.PaymentErrorCode -import com.sangdol.roomescape.payment.exception.PaymentException -import com.sangdol.roomescape.payment.infrastructure.client.PaymentClientCancelResponse -import com.sangdol.roomescape.payment.infrastructure.client.PaymentClientConfirmResponse -import com.sangdol.roomescape.payment.infrastructure.client.TosspayClient -import com.sangdol.roomescape.payment.infrastructure.common.PaymentStatus -import org.springframework.http.HttpStatus @RestClientTest(TosspayClient::class) @MockkBean(JpaMetamodelMappingContext::class) diff --git a/service/src/test/kotlin/com/sangdol/roomescape/region/RegionApiFailTest.kt b/service/src/test/kotlin/com/sangdol/roomescape/region/RegionApiFailTest.kt index 1621aab9..6b5fabd2 100644 --- a/service/src/test/kotlin/com/sangdol/roomescape/region/RegionApiFailTest.kt +++ b/service/src/test/kotlin/com/sangdol/roomescape/region/RegionApiFailTest.kt @@ -1,16 +1,16 @@ package com.sangdol.roomescape.region import com.ninjasquad.springmockk.MockkBean -import io.mockk.every -import org.springframework.http.HttpMethod import com.sangdol.roomescape.region.exception.RegionErrorCode import com.sangdol.roomescape.region.infrastructure.persistence.RegionRepository import com.sangdol.roomescape.supports.FunSpecSpringbootTest import com.sangdol.roomescape.supports.runExceptionTest +import io.mockk.every +import org.springframework.http.HttpMethod class RegionApiFailTest( @MockkBean private val regionRepository: RegionRepository -): FunSpecSpringbootTest() { +) : FunSpecSpringbootTest() { init { context("조회 실패") { test("시/도") { diff --git a/service/src/test/kotlin/com/sangdol/roomescape/region/RegionApiSuccessTest.kt b/service/src/test/kotlin/com/sangdol/roomescape/region/RegionApiSuccessTest.kt index cbb3ff83..4d5dbdd1 100644 --- a/service/src/test/kotlin/com/sangdol/roomescape/region/RegionApiSuccessTest.kt +++ b/service/src/test/kotlin/com/sangdol/roomescape/region/RegionApiSuccessTest.kt @@ -1,11 +1,11 @@ package com.sangdol.roomescape.region -import io.kotest.matchers.shouldBe import com.sangdol.common.types.web.HttpStatus import com.sangdol.roomescape.supports.FunSpecSpringbootTest import com.sangdol.roomescape.supports.runTest +import io.kotest.matchers.shouldBe -class RegionApiSuccessTest: FunSpecSpringbootTest() { +class RegionApiSuccessTest : FunSpecSpringbootTest() { init { context("시/도 -> 시/군/구 -> 지역 코드 순으로 조회한다.") { test("정상 응답") { diff --git a/service/src/test/kotlin/com/sangdol/roomescape/reservation/ReservationApiTest.kt b/service/src/test/kotlin/com/sangdol/roomescape/reservation/ReservationApiTest.kt index 49b97aee..9d255626 100644 --- a/service/src/test/kotlin/com/sangdol/roomescape/reservation/ReservationApiTest.kt +++ b/service/src/test/kotlin/com/sangdol/roomescape/reservation/ReservationApiTest.kt @@ -1,13 +1,8 @@ package com.sangdol.roomescape.reservation -import io.kotest.matchers.shouldBe -import io.kotest.matchers.shouldNotBe -import org.hamcrest.CoreMatchers.equalTo -import org.springframework.data.repository.findByIdOrNull -import org.springframework.http.HttpMethod +import com.sangdol.common.types.exception.CommonErrorCode import com.sangdol.common.types.web.HttpStatus import com.sangdol.roomescape.auth.exception.AuthErrorCode -import com.sangdol.common.types.exception.CommonErrorCode import com.sangdol.roomescape.payment.infrastructure.common.BankCode import com.sangdol.roomescape.payment.infrastructure.common.CardIssuerCode import com.sangdol.roomescape.payment.infrastructure.common.EasyPayCompanyCode @@ -25,6 +20,11 @@ import com.sangdol.roomescape.schedule.infrastructure.persistence.ScheduleStatus import com.sangdol.roomescape.supports.* import com.sangdol.roomescape.theme.infrastructure.persistence.ThemeEntity import com.sangdol.roomescape.theme.infrastructure.persistence.ThemeRepository +import io.kotest.matchers.shouldBe +import io.kotest.matchers.shouldNotBe +import org.hamcrest.CoreMatchers.equalTo +import org.springframework.data.repository.findByIdOrNull +import org.springframework.http.HttpMethod import java.time.LocalDate import java.time.LocalTime @@ -574,7 +574,10 @@ class ReservationApiTest( expect = { statusCode(HttpStatus.OK.value()) assertProperties(props = setOf("id", "reserver", "user", "applicationDateTime", "payment")) - assertProperties(props = setOf("name", "contact", "participantCount", "requirement"), propsNameIfList = "reserver") + assertProperties( + props = setOf("name", "contact", "participantCount", "requirement"), + propsNameIfList = "reserver" + ) assertProperties(props = setOf("id", "name", "phone"), propsNameIfList = "user") } ).also { diff --git a/service/src/test/kotlin/com/sangdol/roomescape/schedule/AdminScheduleApiTest.kt b/service/src/test/kotlin/com/sangdol/roomescape/schedule/AdminScheduleApiTest.kt index b24fa2cc..a47cca77 100644 --- a/service/src/test/kotlin/com/sangdol/roomescape/schedule/AdminScheduleApiTest.kt +++ b/service/src/test/kotlin/com/sangdol/roomescape/schedule/AdminScheduleApiTest.kt @@ -99,7 +99,10 @@ class AdminScheduleApiTest( }, expect = { statusCode(HttpStatus.OK.value()) - body("data.schedules.size()", equalTo(schedules.filter { it.date.isEqual(KoreaDate.today()) }.size)) + body( + "data.schedules.size()", + equalTo(schedules.filter { it.date.isEqual(KoreaDate.today()) }.size) + ) assertProperties( props = setOf("id", "themeName", "startFrom", "endAt", "status"), propsNameIfList = "schedules" diff --git a/service/src/test/kotlin/com/sangdol/roomescape/schedule/ScheduleApiTest.kt b/service/src/test/kotlin/com/sangdol/roomescape/schedule/ScheduleApiTest.kt index b2532cf8..2ad2c5a6 100644 --- a/service/src/test/kotlin/com/sangdol/roomescape/schedule/ScheduleApiTest.kt +++ b/service/src/test/kotlin/com/sangdol/roomescape/schedule/ScheduleApiTest.kt @@ -57,7 +57,15 @@ class ScheduleApiTest( statusCode(HttpStatus.OK.value()) body("data.schedules.size()", equalTo(size)) assertProperties( - props = setOf("id", "startFrom", "endAt", "themeId", "themeName", "themeDifficulty", "status"), + props = setOf( + "id", + "startFrom", + "endAt", + "themeId", + "themeName", + "themeDifficulty", + "status" + ), propsNameIfList = "schedules" ) } diff --git a/service/src/test/kotlin/com/sangdol/roomescape/schedule/ScheduleConcurrencyTest.kt b/service/src/test/kotlin/com/sangdol/roomescape/schedule/ScheduleConcurrencyTest.kt index c237d11e..d447729c 100644 --- a/service/src/test/kotlin/com/sangdol/roomescape/schedule/ScheduleConcurrencyTest.kt +++ b/service/src/test/kotlin/com/sangdol/roomescape/schedule/ScheduleConcurrencyTest.kt @@ -7,8 +7,6 @@ import com.sangdol.roomescape.schedule.infrastructure.persistence.ScheduleStatus import com.sangdol.roomescape.supports.FunSpecSpringbootTest import com.sangdol.roomescape.supports.runTest import io.kotest.assertions.assertSoftly -import io.kotest.matchers.collections.shouldContainExactly -import io.kotest.matchers.collections.shouldContainExactlyInAnyOrder import io.kotest.matchers.nulls.shouldNotBeNull import io.kotest.matchers.shouldBe import kotlinx.coroutines.Dispatchers diff --git a/service/src/test/kotlin/com/sangdol/roomescape/store/AdminStoreApiTest.kt b/service/src/test/kotlin/com/sangdol/roomescape/store/AdminStoreApiTest.kt index 8e74c6a4..9b1f77a8 100644 --- a/service/src/test/kotlin/com/sangdol/roomescape/store/AdminStoreApiTest.kt +++ b/service/src/test/kotlin/com/sangdol/roomescape/store/AdminStoreApiTest.kt @@ -1,10 +1,5 @@ package com.sangdol.roomescape.store -import io.kotest.assertions.assertSoftly -import io.kotest.matchers.date.shouldBeAfter -import io.kotest.matchers.shouldBe -import org.springframework.data.repository.findByIdOrNull -import org.springframework.http.HttpMethod import com.sangdol.common.types.web.HttpStatus import com.sangdol.roomescape.admin.infrastructure.persistence.AdminEntity import com.sangdol.roomescape.admin.infrastructure.persistence.AdminPermissionLevel @@ -16,6 +11,11 @@ import com.sangdol.roomescape.store.infrastructure.persistence.StoreRepository import com.sangdol.roomescape.store.infrastructure.persistence.StoreStatus import com.sangdol.roomescape.store.web.StoreUpdateRequest import com.sangdol.roomescape.supports.* +import io.kotest.assertions.assertSoftly +import io.kotest.matchers.date.shouldBeAfter +import io.kotest.matchers.shouldBe +import org.springframework.data.repository.findByIdOrNull +import org.springframework.http.HttpMethod class AdminStoreApiTest( private val storeRepository: StoreRepository, diff --git a/service/src/test/kotlin/com/sangdol/roomescape/store/StoreApiTest.kt b/service/src/test/kotlin/com/sangdol/roomescape/store/StoreApiTest.kt index d8af0c5f..79839aa1 100644 --- a/service/src/test/kotlin/com/sangdol/roomescape/store/StoreApiTest.kt +++ b/service/src/test/kotlin/com/sangdol/roomescape/store/StoreApiTest.kt @@ -1,13 +1,13 @@ package com.sangdol.roomescape.store -import org.hamcrest.CoreMatchers.equalTo -import org.springframework.http.HttpMethod import com.sangdol.common.types.web.HttpStatus import com.sangdol.roomescape.store.exception.StoreErrorCode import com.sangdol.roomescape.store.infrastructure.persistence.StoreEntity import com.sangdol.roomescape.supports.* +import org.hamcrest.CoreMatchers.equalTo +import org.springframework.http.HttpMethod -class StoreApiTest: FunSpecSpringbootTest() { +class StoreApiTest : FunSpecSpringbootTest() { init { context("모든 매장의 id / 이름을 조회한다.") { diff --git a/service/src/test/kotlin/com/sangdol/roomescape/supports/RestAssuredUtils.kt b/service/src/test/kotlin/com/sangdol/roomescape/supports/RestAssuredUtils.kt index af53b62e..62155a0a 100644 --- a/service/src/test/kotlin/com/sangdol/roomescape/supports/RestAssuredUtils.kt +++ b/service/src/test/kotlin/com/sangdol/roomescape/supports/RestAssuredUtils.kt @@ -1,7 +1,7 @@ package com.sangdol.roomescape.supports -import com.sangdol.common.web.config.JacksonConfig import com.sangdol.common.types.exception.ErrorCode +import com.sangdol.common.web.config.JacksonConfig import io.restassured.module.kotlin.extensions.Given import io.restassured.module.kotlin.extensions.Then import io.restassured.module.kotlin.extensions.When diff --git a/service/src/test/kotlin/com/sangdol/roomescape/supports/TestAuthUtil.kt b/service/src/test/kotlin/com/sangdol/roomescape/supports/TestAuthUtil.kt index a3340a19..90f111c4 100644 --- a/service/src/test/kotlin/com/sangdol/roomescape/supports/TestAuthUtil.kt +++ b/service/src/test/kotlin/com/sangdol/roomescape/supports/TestAuthUtil.kt @@ -1,12 +1,6 @@ package com.sangdol.roomescape.supports -import io.restassured.module.kotlin.extensions.Extract -import io.restassured.module.kotlin.extensions.Given -import io.restassured.module.kotlin.extensions.Then -import io.restassured.module.kotlin.extensions.When -import org.springframework.data.repository.findByIdOrNull import com.sangdol.common.types.web.HttpStatus -import org.springframework.http.MediaType import com.sangdol.roomescape.admin.infrastructure.persistence.AdminEntity import com.sangdol.roomescape.admin.infrastructure.persistence.AdminRepository import com.sangdol.roomescape.admin.infrastructure.persistence.AdminType @@ -16,6 +10,12 @@ import com.sangdol.roomescape.store.infrastructure.persistence.StoreRepository import com.sangdol.roomescape.user.infrastructure.persistence.UserEntity import com.sangdol.roomescape.user.infrastructure.persistence.UserRepository import com.sangdol.roomescape.user.web.UserCreateRequest +import io.restassured.module.kotlin.extensions.Extract +import io.restassured.module.kotlin.extensions.Given +import io.restassured.module.kotlin.extensions.Then +import io.restassured.module.kotlin.extensions.When +import org.springframework.data.repository.findByIdOrNull +import org.springframework.http.MediaType class TestAuthUtil( private val userRepository: UserRepository, @@ -50,7 +50,7 @@ class TestAuthUtil( } } - fun signup(request: UserCreateRequest): UserEntity { + fun signup(request: UserCreateRequest): UserEntity { println("[TestAuthUtil] 회원가입 시작: $request") val userId: Long = Given { contentType(MediaType.APPLICATION_JSON_VALUE) diff --git a/service/src/test/kotlin/com/sangdol/roomescape/supports/TestDatabaseUtil.kt b/service/src/test/kotlin/com/sangdol/roomescape/supports/TestDatabaseUtil.kt index 74f9285e..48e0b510 100644 --- a/service/src/test/kotlin/com/sangdol/roomescape/supports/TestDatabaseUtil.kt +++ b/service/src/test/kotlin/com/sangdol/roomescape/supports/TestDatabaseUtil.kt @@ -23,7 +23,8 @@ class TestDatabaseUtil( } fun initializeRegion() { - jdbcTemplate.queryForObject("SELECT EXISTS (SELECT 1 FROM region LIMIT 1)", Boolean::class.java)!!.also { isRegionTableEmpty -> + jdbcTemplate.queryForObject("SELECT EXISTS (SELECT 1 FROM region LIMIT 1)", Boolean::class.java)!! + .also { isRegionTableEmpty -> if (!isRegionTableEmpty) { this::class.java.getResource("/schema/region-data.sql")?.readText()?.let { regionInsertSql -> jdbcTemplate.execute(regionInsertSql) @@ -51,7 +52,7 @@ enum class CleanerMode { ALL } -class DatabaseCleanerExtension: BeforeSpecListener, AfterTestListener, AfterSpecListener { +class DatabaseCleanerExtension : BeforeSpecListener, AfterTestListener, AfterSpecListener { override suspend fun beforeSpec(spec: Spec) { super.beforeSpec(spec) diff --git a/service/src/test/kotlin/com/sangdol/roomescape/supports/TestUtil.kt b/service/src/test/kotlin/com/sangdol/roomescape/supports/TestUtil.kt index 0e262845..e0976c93 100644 --- a/service/src/test/kotlin/com/sangdol/roomescape/supports/TestUtil.kt +++ b/service/src/test/kotlin/com/sangdol/roomescape/supports/TestUtil.kt @@ -12,8 +12,8 @@ inline fun initialize(name: String, block: () -> T): T { fun randomPhoneNumber(): String { val prefix = "010" - val middle = (1..4).map { (0..9).random() }.joinToString("") - val last = (1..4).map { (0..9).random() }.joinToString("") + val middle = (1..4).map { (0..9).random() }.joinToString("") + val last = (1..4).map { (0..9).random() }.joinToString("") return "$prefix$middle$last" } diff --git a/service/src/test/kotlin/com/sangdol/roomescape/theme/AdminThemeApiTest.kt b/service/src/test/kotlin/com/sangdol/roomescape/theme/AdminThemeApiTest.kt index de15aa00..f70cbecf 100644 --- a/service/src/test/kotlin/com/sangdol/roomescape/theme/AdminThemeApiTest.kt +++ b/service/src/test/kotlin/com/sangdol/roomescape/theme/AdminThemeApiTest.kt @@ -1,10 +1,5 @@ package com.sangdol.roomescape.theme -import io.kotest.matchers.nulls.shouldNotBeNull -import io.kotest.matchers.shouldBe -import org.hamcrest.CoreMatchers.equalTo -import org.springframework.data.repository.findByIdOrNull -import org.springframework.http.HttpMethod import com.sangdol.common.types.web.HttpStatus import com.sangdol.roomescape.admin.infrastructure.persistence.AdminPermissionLevel import com.sangdol.roomescape.admin.infrastructure.persistence.AdminType @@ -18,6 +13,11 @@ import com.sangdol.roomescape.theme.exception.ThemeErrorCode import com.sangdol.roomescape.theme.infrastructure.persistence.ThemeEntity import com.sangdol.roomescape.theme.infrastructure.persistence.ThemeRepository import com.sangdol.roomescape.theme.web.ThemeUpdateRequest +import io.kotest.matchers.nulls.shouldNotBeNull +import io.kotest.matchers.shouldBe +import org.hamcrest.CoreMatchers.equalTo +import org.springframework.data.repository.findByIdOrNull +import org.springframework.http.HttpMethod class AdminThemeApiTest( private val themeRepository: ThemeRepository diff --git a/service/src/test/kotlin/com/sangdol/roomescape/theme/DateUtilsTest.kt b/service/src/test/kotlin/com/sangdol/roomescape/theme/DateUtilsTest.kt index b17b6620..8aa1a215 100644 --- a/service/src/test/kotlin/com/sangdol/roomescape/theme/DateUtilsTest.kt +++ b/service/src/test/kotlin/com/sangdol/roomescape/theme/DateUtilsTest.kt @@ -9,7 +9,7 @@ class DateUtilsTest : StringSpec({ "입력된 날짜의 이전 주 일요일을 찾는다." { val expected = LocalDate.of(2025, 8, 31) - for (i in 7..13){ + for (i in 7..13) { DateUtils.getSundayOfPreviousWeek(LocalDate.of(2025, 9, i)) shouldBe expected } } diff --git a/service/src/test/kotlin/com/sangdol/roomescape/user/UserApiTest.kt b/service/src/test/kotlin/com/sangdol/roomescape/user/UserApiTest.kt index db98d5d3..108152a6 100644 --- a/service/src/test/kotlin/com/sangdol/roomescape/user/UserApiTest.kt +++ b/service/src/test/kotlin/com/sangdol/roomescape/user/UserApiTest.kt @@ -1,6 +1,19 @@ package com.sangdol.roomescape.user import com.ninjasquad.springmockk.SpykBean +import com.sangdol.common.types.exception.CommonErrorCode +import com.sangdol.common.types.web.HttpStatus +import com.sangdol.roomescape.auth.exception.AuthErrorCode +import com.sangdol.roomescape.auth.infrastructure.jwt.JwtUtils +import com.sangdol.roomescape.supports.FunSpecSpringbootTest +import com.sangdol.roomescape.supports.UserFixture +import com.sangdol.roomescape.supports.runExceptionTest +import com.sangdol.roomescape.supports.runTest +import com.sangdol.roomescape.user.business.SIGNUP +import com.sangdol.roomescape.user.exception.UserErrorCode +import com.sangdol.roomescape.user.infrastructure.persistence.* +import com.sangdol.roomescape.user.web.MIN_PASSWORD_LENGTH +import com.sangdol.roomescape.user.web.UserCreateRequest import io.kotest.assertions.assertSoftly import io.kotest.matchers.shouldBe import io.mockk.every @@ -11,20 +24,7 @@ import io.restassured.module.kotlin.extensions.When import org.hamcrest.CoreMatchers.equalTo import org.springframework.data.repository.findByIdOrNull import org.springframework.http.HttpMethod -import com.sangdol.common.types.web.HttpStatus import org.springframework.http.MediaType -import com.sangdol.roomescape.auth.exception.AuthErrorCode -import com.sangdol.roomescape.auth.infrastructure.jwt.JwtUtils -import com.sangdol.common.types.exception.CommonErrorCode -import com.sangdol.roomescape.supports.FunSpecSpringbootTest -import com.sangdol.roomescape.supports.UserFixture -import com.sangdol.roomescape.supports.runExceptionTest -import com.sangdol.roomescape.supports.runTest -import com.sangdol.roomescape.user.business.SIGNUP -import com.sangdol.roomescape.user.exception.UserErrorCode -import com.sangdol.roomescape.user.infrastructure.persistence.* -import com.sangdol.roomescape.user.web.MIN_PASSWORD_LENGTH -import com.sangdol.roomescape.user.web.UserCreateRequest class UserApiTest( private val userRepository: UserRepository, diff --git a/tosspay-mock/src/main/kotlin/com/sangdol/tosspaymock/business/domain/Payment.kt b/tosspay-mock/src/main/kotlin/com/sangdol/tosspaymock/business/domain/Payment.kt index a9bc013e..0f581fe9 100644 --- a/tosspay-mock/src/main/kotlin/com/sangdol/tosspaymock/business/domain/Payment.kt +++ b/tosspay-mock/src/main/kotlin/com/sangdol/tosspaymock/business/domain/Payment.kt @@ -47,7 +47,7 @@ class Payment( val version: String = "2022-11-16", val metadata: String? = null ) { - companion object { + companion object { fun randomWithCard( paymentKey: String, orderId: String, @@ -179,7 +179,6 @@ class Payment( } } - fun toResponse() = PaymentResponse( mid = this.mid, lastTransactionKey = this.lastTransactionKey, diff --git a/tosspay-mock/src/main/kotlin/com/sangdol/tosspaymock/business/domain/card/Card.kt b/tosspay-mock/src/main/kotlin/com/sangdol/tosspaymock/business/domain/card/Card.kt index 4bb0956b..0aee6e79 100644 --- a/tosspay-mock/src/main/kotlin/com/sangdol/tosspaymock/business/domain/card/Card.kt +++ b/tosspay-mock/src/main/kotlin/com/sangdol/tosspaymock/business/domain/card/Card.kt @@ -38,7 +38,6 @@ class Card( } } - fun toResponse() = CardResponse( issuerCode = this.issuerCode.code, acquirerCode = this.acquirerCode.code, diff --git a/tosspay-mock/src/main/kotlin/com/sangdol/tosspaymock/exception/code/TosspayCancelErrorCode.kt b/tosspay-mock/src/main/kotlin/com/sangdol/tosspaymock/exception/code/TosspayCancelErrorCode.kt index ed1fb31d..384486a4 100644 --- a/tosspay-mock/src/main/kotlin/com/sangdol/tosspaymock/exception/code/TosspayCancelErrorCode.kt +++ b/tosspay-mock/src/main/kotlin/com/sangdol/tosspaymock/exception/code/TosspayCancelErrorCode.kt @@ -25,14 +25,26 @@ enum class TosspayCancelErrorCode( NOT_CANCELABLE_PAYMENT(HttpStatus.FORBIDDEN, "CO016", "취소 할 수 없는 결제 입니다."), EXCEED_MAX_REFUND_DUE(HttpStatus.FORBIDDEN, "CO017", "환불 가능한 기간이 지났습니다."), NOT_ALLOWED_PARTIAL_REFUND_WAITING_DEPOSIT(HttpStatus.FORBIDDEN, "CO018", "입금 대기중인 결제는 부분 환불이 불가합니다."), - NOT_ALLOWED_PARTIAL_REFUND(HttpStatus.FORBIDDEN, "CO019", "에스크로 주문, 현금 카드 결제일 때는 부분 환불이 불가합니다. 이외 다른 결제 수단에서 부분 취소가 되지 않을 때는 토스페이먼츠에 문의해 주세요."), + NOT_ALLOWED_PARTIAL_REFUND( + HttpStatus.FORBIDDEN, + "CO019", + "에스크로 주문, 현금 카드 결제일 때는 부분 환불이 불가합니다. 이외 다른 결제 수단에서 부분 취소가 되지 않을 때는 토스페이먼츠에 문의해 주세요." + ), NOT_AVAILABLE_BANK(HttpStatus.FORBIDDEN, "CO020", "은행 서비스 시간이 아닙니다."), INCORRECT_BASIC_AUTH_FORMAT(HttpStatus.FORBIDDEN, "CO021", "잘못된 요청입니다. ':' 를 포함해 인코딩해주세요."), NOT_CANCELABLE_PAYMENT_FOR_DORMANT_USER(HttpStatus.FORBIDDEN, "CO022", "휴면 처리된 회원의 결제는 취소할 수 없습니다."), NOT_FOUND_PAYMENT(HttpStatus.NOT_FOUND, "CO023", "존재하지 않는 결제 정보 입니다."), - FAILED_INTERNAL_SYSTEM_PROCESSING(HttpStatus.INTERNAL_SERVER_ERROR, "CO024", "내부 시스템 처리 작업이 실패했습니다. 잠시 후 다시 시도해주세요."), + FAILED_INTERNAL_SYSTEM_PROCESSING( + HttpStatus.INTERNAL_SERVER_ERROR, + "CO024", + "내부 시스템 처리 작업이 실패했습니다. 잠시 후 다시 시도해주세요." + ), FAILED_REFUND_PROCESS(HttpStatus.INTERNAL_SERVER_ERROR, "CO025", "은행 응답시간 지연이나 일시적인 오류로 환불요청에 실패했습니다."), - FAILED_METHOD_HANDLING_CANCEL(HttpStatus.INTERNAL_SERVER_ERROR, "CO026", "취소 중 결제 시 사용한 결제 수단 처리과정에서 일시적인 오류가 발생했습니다."), + FAILED_METHOD_HANDLING_CANCEL( + HttpStatus.INTERNAL_SERVER_ERROR, + "CO026", + "취소 중 결제 시 사용한 결제 수단 처리과정에서 일시적인 오류가 발생했습니다." + ), FAILED_PARTIAL_REFUND(HttpStatus.INTERNAL_SERVER_ERROR, "CO027", "은행 점검, 해약 계좌 등의 사유로 부분 환불이 실패했습니다."), COMMON_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "CO028", "일시적인 오류가 발생했습니다. 잠시 후 다시 시도해주세요."), FAILED_PAYMENT_INTERNAL_SYSTEM_PROCESSING(HttpStatus.INTERNAL_SERVER_ERROR, "CO029", "결제가 완료되지 않았어요. 다시 시도해주세요."); diff --git a/tosspay-mock/src/main/kotlin/com/sangdol/tosspaymock/exception/code/TosspayConfirmErrorCode.kt b/tosspay-mock/src/main/kotlin/com/sangdol/tosspaymock/exception/code/TosspayConfirmErrorCode.kt index 253f8852..d04f2941 100644 --- a/tosspay-mock/src/main/kotlin/com/sangdol/tosspaymock/exception/code/TosspayConfirmErrorCode.kt +++ b/tosspay-mock/src/main/kotlin/com/sangdol/tosspaymock/exception/code/TosspayConfirmErrorCode.kt @@ -25,9 +25,17 @@ enum class TosspayConfirmErrorCode( NOT_FOUND_TERMINAL_ID(HttpStatus.BAD_REQUEST, "CO016", "단말기번호(Terminal Id)가 없습니다. 토스페이먼츠로 문의 바랍니다."), INVALID_AUTHORIZE_AUTH(HttpStatus.BAD_REQUEST, "CO017", "유효하지 않은 인증 방식입니다."), INVALID_CARD_LOST_OR_STOLEN(HttpStatus.BAD_REQUEST, "CO018", "분실 혹은 도난 카드입니다."), - RESTRICTED_TRANSFER_ACCOUNT(HttpStatus.BAD_REQUEST, "CO019", "계좌는 등록 후 12시간 뒤부터 결제할 수 있습니다. 관련 정책은 해당 은행으로 문의해주세요."), + RESTRICTED_TRANSFER_ACCOUNT( + HttpStatus.BAD_REQUEST, + "CO019", + "계좌는 등록 후 12시간 뒤부터 결제할 수 있습니다. 관련 정책은 해당 은행으로 문의해주세요." + ), INVALID_CARD_NUMBER(HttpStatus.BAD_REQUEST, "CO020", "카드번호를 다시 확인해주세요."), - INVALID_UNREGISTERED_SUBMALL(HttpStatus.BAD_REQUEST, "CO021", "등록되지 않은 서브몰입니다. 서브몰이 없는 가맹점이라면 안심클릭이나 ISP 결제가 필요합니다."), + INVALID_UNREGISTERED_SUBMALL( + HttpStatus.BAD_REQUEST, + "CO021", + "등록되지 않은 서브몰입니다. 서브몰이 없는 가맹점이라면 안심클릭이나 ISP 결제가 필요합니다." + ), NOT_REGISTERED_BUSINESS(HttpStatus.BAD_REQUEST, "CO022", "등록되지 않은 사업자 번호입니다."), EXCEED_MAX_ONE_DAY_WITHDRAW_AMOUNT(HttpStatus.BAD_REQUEST, "CO023", "1일 출금 한도를 초과했습니다."), EXCEED_MAX_ONE_TIME_WITHDRAW_AMOUNT(HttpStatus.BAD_REQUEST, "CO024", "1회 출금 한도를 초과했습니다."), @@ -48,10 +56,18 @@ enum class TosspayConfirmErrorCode( NOT_AVAILABLE_BANK(HttpStatus.FORBIDDEN, "CO039", "은행 서비스 시간이 아닙니다."), INVALID_PASSWORD(HttpStatus.FORBIDDEN, "CO040", "결제 비밀번호가 일치하지 않습니다."), INCORRECT_BASIC_AUTH_FORMAT(HttpStatus.FORBIDDEN, "CO041", "잘못된 요청입니다. ':' 를 포함해 인코딩해주세요."), - FDS_ERROR(HttpStatus.FORBIDDEN, "CO042", "[토스페이먼츠] 위험거래가 감지되어 결제가 제한됩니다. 발송된 문자에 포함된 링크를 통해 본인인증 후 결제가 가능합니다. (고객센터: 1644-8051)"), + FDS_ERROR( + HttpStatus.FORBIDDEN, + "CO042", + "[토스페이먼츠] 위험거래가 감지되어 결제가 제한됩니다. 발송된 문자에 포함된 링크를 통해 본인인증 후 결제가 가능합니다. (고객센터: 1644-8051)" + ), NOT_FOUND_PAYMENT(HttpStatus.NOT_FOUND, "CO043", "존재하지 않는 결제 정보 입니다."), NOT_FOUND_PAYMENT_SESSION(HttpStatus.NOT_FOUND, "CO044", "결제 시간이 만료되어 결제 진행 데이터가 존재하지 않습니다."), FAILED_PAYMENT_INTERNAL_SYSTEM_PROCESSING(HttpStatus.INTERNAL_SERVER_ERROR, "CO045", "결제가 완료되지 않았어요. 다시 시도해주세요."), - FAILED_INTERNAL_SYSTEM_PROCESSING(HttpStatus.INTERNAL_SERVER_ERROR, "CO046", "내부 시스템 처리 작업이 실패했습니다. 잠시 후 다시 시도해주세요."), + FAILED_INTERNAL_SYSTEM_PROCESSING( + HttpStatus.INTERNAL_SERVER_ERROR, + "CO046", + "내부 시스템 처리 작업이 실패했습니다. 잠시 후 다시 시도해주세요." + ), UNKNOWN_PAYMENT_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "CO047", "결제에 실패했어요. 같은 문제가 반복된다면 은행이나 카드사로 문의해주세요."); } diff --git a/tosspay-mock/src/main/kotlin/com/sangdol/tosspaymock/web/dto/TosspayResponse.kt b/tosspay-mock/src/main/kotlin/com/sangdol/tosspaymock/web/dto/TosspayResponse.kt index 4e8b9bd1..96a68a67 100644 --- a/tosspay-mock/src/main/kotlin/com/sangdol/tosspaymock/web/dto/TosspayResponse.kt +++ b/tosspay-mock/src/main/kotlin/com/sangdol/tosspaymock/web/dto/TosspayResponse.kt @@ -1,11 +1,6 @@ package com.sangdol.tosspaymock.web.dto -import com.sangdol.tosspaymock.business.domain.Payment import com.sangdol.tosspaymock.business.domain.PaymentType -import com.sangdol.tosspaymock.business.domain.cancel.Cancellation -import com.sangdol.tosspaymock.business.domain.card.Card -import com.sangdol.tosspaymock.business.domain.easypay.Easypay -import com.sangdol.tosspaymock.business.domain.transfer.BankTransfer import java.time.OffsetDateTime data class PaymentResponse( diff --git a/tosspay-mock/src/main/resources/logback-deploy.xml b/tosspay-mock/src/main/resources/logback-deploy.xml index b298ea1d..af3eb673 100644 --- a/tosspay-mock/src/main/resources/logback-deploy.xml +++ b/tosspay-mock/src/main/resources/logback-deploy.xml @@ -82,7 +82,8 @@ 512 - 0 false + 0 + false diff --git a/tosspay-mock/src/main/resources/schema/schema-h2.sql b/tosspay-mock/src/main/resources/schema/schema-h2.sql index 57277e11..d41abd69 100644 --- a/tosspay-mock/src/main/resources/schema/schema-h2.sql +++ b/tosspay-mock/src/main/resources/schema/schema-h2.sql @@ -1,10 +1,20 @@ -create table if not exists order_amount ( - id bigint primary key, - payment_key varchar(255) not null, - approved_amount integer not null, - easypay_discount_amount integer not null, - card_discount_amount integer not null, - transfer_discount_amount integer not null, - - constraint uk_order_amount__payment_key unique (payment_key) -); +create table if not exists order_amount +( + id + bigint + primary + key, + payment_key + varchar +( + 255 +) not null, + approved_amount integer not null, + easypay_discount_amount integer not null, + card_discount_amount integer not null, + transfer_discount_amount integer not null, + constraint uk_order_amount__payment_key unique +( + payment_key +) + ); diff --git a/tosspay-mock/src/test/kotlin/com/sangdol/tosspaymock/parser/origin/TosspayErrorCodeParser.kt b/tosspay-mock/src/test/kotlin/com/sangdol/tosspaymock/parser/origin/TosspayErrorCodeParser.kt index ee5766c6..2e8f8976 100644 --- a/tosspay-mock/src/test/kotlin/com/sangdol/tosspaymock/parser/origin/TosspayErrorCodeParser.kt +++ b/tosspay-mock/src/test/kotlin/com/sangdol/tosspaymock/parser/origin/TosspayErrorCodeParser.kt @@ -4,7 +4,7 @@ import com.sangdol.common.types.web.HttpStatus import io.kotest.core.spec.style.StringSpec import java.io.File -class TosspayErrorCodeParser: StringSpec() { +class TosspayErrorCodeParser : StringSpec() { init { "Tosspay API 문서에 있는 결제 승인 에러 코드 항목을 enum의 형태로 변환한다." { val basePath = "${File("").absolutePath}/src/test/resources" @@ -31,7 +31,8 @@ class TosspayErrorCodeParser: StringSpec() { return regex.replace(text) { matchResult -> val name = matchResult.groupValues[2] - val httpStatus = "HttpStatus.${HttpStatus.entries.first {it.code == matchResult.groupValues[1].trim().toInt()}.name}" + val httpStatus = + "HttpStatus.${HttpStatus.entries.first { it.code == matchResult.groupValues[1].trim().toInt() }.name}" val errorCode = "CO${(idx).toString().padStart(3, '0')}" val koreanMessage = matchResult.groupValues[3].split("\t")[0]