[#44] 매장 기능 도입 #45

Merged
pricelees merged 116 commits from feat/#44 into main 2025-09-20 03:15:06 +00:00
6 changed files with 36 additions and 22 deletions
Showing only changes of commit afedaa21b8 - Show all commits

View File

@ -4,7 +4,6 @@ import io.github.oshai.kotlinlogging.KLogger
import io.github.oshai.kotlinlogging.KotlinLogging import io.github.oshai.kotlinlogging.KotlinLogging
import jakarta.servlet.http.HttpServletRequest import jakarta.servlet.http.HttpServletRequest
import jakarta.servlet.http.HttpServletResponse import jakarta.servlet.http.HttpServletResponse
import org.slf4j.MDC
import org.springframework.stereotype.Component import org.springframework.stereotype.Component
import org.springframework.web.method.HandlerMethod import org.springframework.web.method.HandlerMethod
import org.springframework.web.servlet.HandlerInterceptor import org.springframework.web.servlet.HandlerInterceptor
@ -18,7 +17,7 @@ import roomescape.auth.exception.AuthException
import roomescape.auth.infrastructure.jwt.JwtUtils import roomescape.auth.infrastructure.jwt.JwtUtils
import roomescape.auth.web.support.AdminOnly import roomescape.auth.web.support.AdminOnly
import roomescape.auth.web.support.accessToken import roomescape.auth.web.support.accessToken
import roomescape.common.dto.MDC_PRINCIPAL_ID_KEY import roomescape.common.util.MdcPrincipalId
private val log: KLogger = KotlinLogging.logger {} private val log: KLogger = KotlinLogging.logger {}
@ -39,7 +38,7 @@ class AdminInterceptor(
try { try {
run { run {
val id: String = jwtUtils.extractSubject(token).also { MDC.put(MDC_PRINCIPAL_ID_KEY, it) } val id: String = jwtUtils.extractSubject(token).also { MdcPrincipalId.set(it) }
val type: AdminType = validateTypeAndGet(token, annotation.type) val type: AdminType = validateTypeAndGet(token, annotation.type)
val permission: AdminPermissionLevel = validatePermissionAndGet(token, annotation.privilege) val permission: AdminPermissionLevel = validatePermissionAndGet(token, annotation.privilege)

View File

@ -4,7 +4,6 @@ import io.github.oshai.kotlinlogging.KLogger
import io.github.oshai.kotlinlogging.KotlinLogging import io.github.oshai.kotlinlogging.KotlinLogging
import jakarta.servlet.http.HttpServletRequest import jakarta.servlet.http.HttpServletRequest
import jakarta.servlet.http.HttpServletResponse import jakarta.servlet.http.HttpServletResponse
import org.slf4j.MDC
import org.springframework.stereotype.Component import org.springframework.stereotype.Component
import org.springframework.web.method.HandlerMethod import org.springframework.web.method.HandlerMethod
import org.springframework.web.servlet.HandlerInterceptor import org.springframework.web.servlet.HandlerInterceptor
@ -14,7 +13,7 @@ import roomescape.auth.exception.AuthException
import roomescape.auth.infrastructure.jwt.JwtUtils import roomescape.auth.infrastructure.jwt.JwtUtils
import roomescape.auth.web.support.UserOnly import roomescape.auth.web.support.UserOnly
import roomescape.auth.web.support.accessToken import roomescape.auth.web.support.accessToken
import roomescape.common.dto.MDC_PRINCIPAL_ID_KEY import roomescape.common.util.MdcPrincipalId
private val log: KLogger = KotlinLogging.logger {} private val log: KLogger = KotlinLogging.logger {}
@ -34,7 +33,7 @@ class UserInterceptor(
val token: String? = request.accessToken() val token: String? = request.accessToken()
try { try {
val id: String = jwtUtils.extractSubject(token).also { MDC.put(MDC_PRINCIPAL_ID_KEY, it) } val id: String = jwtUtils.extractSubject(token).also { MdcPrincipalId.set(it) }
/** /**
* CLAIM_ADMIN_TYPE_KEY 존재하면 관리자 토큰임 * CLAIM_ADMIN_TYPE_KEY 존재하면 관리자 토큰임

View File

@ -1,11 +1,10 @@
package roomescape.common.config package roomescape.common.config
import org.slf4j.MDC
import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration import org.springframework.context.annotation.Configuration
import org.springframework.data.domain.AuditorAware import org.springframework.data.domain.AuditorAware
import org.springframework.data.jpa.repository.config.EnableJpaAuditing import org.springframework.data.jpa.repository.config.EnableJpaAuditing
import roomescape.common.dto.MDC_PRINCIPAL_ID_KEY import roomescape.common.util.MdcPrincipalId
import java.util.* import java.util.*
@Configuration @Configuration
@ -17,13 +16,5 @@ class JpaConfig {
} }
class MdcAuditorAware : AuditorAware<Long> { class MdcAuditorAware : AuditorAware<Long> {
override fun getCurrentAuditor(): Optional<Long> { override fun getCurrentAuditor(): Optional<Long> = MdcPrincipalId.extractAsOptionalLongOrEmpty()
val memberIdStr: String? = MDC.get(MDC_PRINCIPAL_ID_KEY)
if (memberIdStr == null) {
return Optional.empty()
} else {
return Optional.of(memberIdStr.toLong())
}
}
} }

View File

@ -8,7 +8,6 @@ import roomescape.auth.web.LoginSuccessResponse
import roomescape.auth.web.UserLoginSuccessResponse import roomescape.auth.web.UserLoginSuccessResponse
import roomescape.user.infrastructure.persistence.UserEntity import roomescape.user.infrastructure.persistence.UserEntity
const val MDC_PRINCIPAL_ID_KEY: String = "principal_id"
abstract class LoginCredentials { abstract class LoginCredentials {
abstract val id: Long abstract val id: Long

View File

@ -2,8 +2,7 @@ package roomescape.common.log
import com.fasterxml.jackson.databind.ObjectMapper import com.fasterxml.jackson.databind.ObjectMapper
import jakarta.servlet.http.HttpServletRequest import jakarta.servlet.http.HttpServletRequest
import org.slf4j.MDC import roomescape.common.util.MdcPrincipalId
import roomescape.common.dto.MDC_PRINCIPAL_ID_KEY
enum class LogType { enum class LogType {
INCOMING_HTTP_REQUEST, INCOMING_HTTP_REQUEST,
@ -34,7 +33,7 @@ class ApiLogMessageConverter(
controllerPayload: Map<String, Any>, controllerPayload: Map<String, Any>,
): String { ): String {
val payload: MutableMap<String, Any> = commonRequestPayload(LogType.CONTROLLER_INVOKED, request) val payload: MutableMap<String, Any> = commonRequestPayload(LogType.CONTROLLER_INVOKED, request)
val memberId: Long? = MDC.get(MDC_PRINCIPAL_ID_KEY)?.toLong() val memberId: Long? = MdcPrincipalId.extractAsLongOrNull()
if (memberId != null) payload["principal_id"] = memberId else payload["principal_id"] = "NONE" if (memberId != null) payload["principal_id"] = memberId else payload["principal_id"] = "NONE"
payload.putAll(controllerPayload) payload.putAll(controllerPayload)
@ -48,7 +47,7 @@ class ApiLogMessageConverter(
payload["endpoint"] = request.endpoint payload["endpoint"] = request.endpoint
payload["status_code"] = request.httpStatus payload["status_code"] = request.httpStatus
MDC.get(MDC_PRINCIPAL_ID_KEY)?.toLongOrNull() MdcPrincipalId.extractAsLongOrNull()
?.let { payload["principal_id"] = it } ?.let { payload["principal_id"] = it }
?: run { payload["principal_id"] = "NONE" } ?: run { payload["principal_id"] = "NONE" }

View File

@ -0,0 +1,27 @@
package roomescape.common.util
import org.slf4j.MDC
import java.util.Optional
private const val MDC_PRINCIPAL_ID_KEY = "principal_id"
object MdcPrincipalId {
fun extractAsLongOrNull(): Long? {
return MDC.get(MDC_PRINCIPAL_ID_KEY)?.toLong()
}
fun extractAsOptionalLongOrEmpty(): Optional<Long> {
return MDC.get(MDC_PRINCIPAL_ID_KEY)?.let {
Optional.of(it.toLong())
} ?: Optional.empty()
}
fun set(id: String) {
MDC.put(MDC_PRINCIPAL_ID_KEY, id)
}
fun clear() {
MDC.remove(MDC_PRINCIPAL_ID_KEY)
}
}