From 0f1ce2a497ee73df41ca439218bd54b251cee9de Mon Sep 17 00:00:00 2001 From: pricelees Date: Sun, 12 Oct 2025 13:32:44 +0900 Subject: [PATCH] =?UTF-8?q?refactor:=20AuthService=EC=97=90=EC=84=9C?= =?UTF-8?q?=EC=9D=98=20Transactional=20=EC=A0=9C=EA=B1=B0=20=EB=B0=8F=20?= =?UTF-8?q?=EC=9D=B4=EB=B2=A4=ED=8A=B8=20=EB=B0=9C=ED=96=89=20=EB=B0=A9?= =?UTF-8?q?=EC=8B=9D=EC=9D=84=20=EC=9D=B4=EC=9A=A9=ED=95=98=EC=97=AC=20?= =?UTF-8?q?=EC=9D=B4=EB=A0=A5=20=EC=A0=80=EC=9E=A5=EC=9D=84=20=EB=B9=84?= =?UTF-8?q?=EB=8F=99=EA=B8=B0=EB=A1=9C=20=EC=B2=98=EB=A6=AC=ED=95=98?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../roomescape/auth/business/AuthService.kt | 19 +++--- .../auth/business/LoginHistoryService.kt | 63 ------------------- 2 files changed, 12 insertions(+), 70 deletions(-) delete mode 100644 service/src/main/kotlin/com/sangdol/roomescape/auth/business/LoginHistoryService.kt diff --git a/service/src/main/kotlin/com/sangdol/roomescape/auth/business/AuthService.kt b/service/src/main/kotlin/com/sangdol/roomescape/auth/business/AuthService.kt index 03023e1c..8938a1fd 100644 --- a/service/src/main/kotlin/com/sangdol/roomescape/auth/business/AuthService.kt +++ b/service/src/main/kotlin/com/sangdol/roomescape/auth/business/AuthService.kt @@ -1,6 +1,7 @@ package com.sangdol.roomescape.auth.business import com.sangdol.roomescape.admin.business.AdminService +import com.sangdol.roomescape.auth.business.domain.LoginHistoryEvent import com.sangdol.roomescape.auth.business.domain.PrincipalType import com.sangdol.roomescape.auth.dto.LoginContext import com.sangdol.roomescape.auth.dto.LoginCredentials @@ -12,8 +13,8 @@ import com.sangdol.roomescape.auth.infrastructure.jwt.JwtUtils import com.sangdol.roomescape.user.business.UserService import io.github.oshai.kotlinlogging.KLogger import io.github.oshai.kotlinlogging.KotlinLogging +import org.springframework.context.ApplicationEventPublisher import org.springframework.stereotype.Service -import org.springframework.transaction.annotation.Transactional private val log: KLogger = KotlinLogging.logger {} @@ -25,10 +26,9 @@ const val CLAIM_STORE_ID_KEY = "store_id" class AuthService( private val adminService: AdminService, private val userService: UserService, - private val loginHistoryService: LoginHistoryService, private val jwtUtils: JwtUtils, + private val eventPublisher: ApplicationEventPublisher ) { - @Transactional(readOnly = true) fun login( request: LoginRequest, context: LoginContext @@ -36,20 +36,25 @@ class AuthService( log.info { "[login] 로그인 시작: account=${request.account}, type=${request.principalType}, context=${context}" } val (credentials, extraClaims) = getCredentials(request) + val event = LoginHistoryEvent( + id = credentials.id, + type = request.principalType, + ipAddress = context.ipAddress, + userAgent = context.userAgent + ) + try { verifyPasswordOrThrow(request, credentials) val accessToken = jwtUtils.createToken(subject = credentials.id.toString(), claims = extraClaims) - loginHistoryService.createSuccessHistory(credentials.id, request.principalType, context) + eventPublisher.publishEvent(event.onSuccess()) return credentials.toResponse(accessToken).also { log.info { "[login] 로그인 완료: account=${request.account}, context=${context}" } } - } catch (e: Exception) { - loginHistoryService.createFailureHistory(credentials.id, request.principalType, context) - + eventPublisher.publishEvent(event.onFailure()) when (e) { is AuthException -> { log.info { "[login] 로그인 실패: account = ${request.account}" } diff --git a/service/src/main/kotlin/com/sangdol/roomescape/auth/business/LoginHistoryService.kt b/service/src/main/kotlin/com/sangdol/roomescape/auth/business/LoginHistoryService.kt deleted file mode 100644 index 662a81bb..00000000 --- a/service/src/main/kotlin/com/sangdol/roomescape/auth/business/LoginHistoryService.kt +++ /dev/null @@ -1,63 +0,0 @@ -package com.sangdol.roomescape.auth.business - -import com.sangdol.common.persistence.IDGenerator -import com.sangdol.roomescape.auth.infrastructure.persistence.LoginHistoryEntity -import com.sangdol.roomescape.auth.infrastructure.persistence.LoginHistoryRepository -import com.sangdol.roomescape.auth.dto.LoginContext -import com.sangdol.roomescape.auth.business.domain.PrincipalType -import io.github.oshai.kotlinlogging.KLogger -import io.github.oshai.kotlinlogging.KotlinLogging -import org.springframework.stereotype.Service -import org.springframework.transaction.annotation.Propagation -import org.springframework.transaction.annotation.Transactional - -private val log: KLogger = KotlinLogging.logger {} - -@Service -class LoginHistoryService( - private val loginHistoryRepository: LoginHistoryRepository, - private val idGenerator: IDGenerator, -) { - @Transactional(propagation = Propagation.REQUIRES_NEW) - fun createSuccessHistory( - principalId: Long, - principalType: PrincipalType, - context: LoginContext - ) { - createHistory(principalId, principalType, success = true, context = context) - } - - @Transactional(propagation = Propagation.REQUIRES_NEW) - fun createFailureHistory( - principalId: Long, - principalType: PrincipalType, - context: LoginContext - ) { - createHistory(principalId, principalType, success = false, context = context) - } - - private fun createHistory( - principalId: Long, - principalType: PrincipalType, - success: Boolean, - context: LoginContext - ) { - log.info { "[createHistory] 로그인 이력 저장 시작: id=${principalId}, type=${principalType}, success=${success}" } - - runCatching { - LoginHistoryEntity( - id = idGenerator.create(), - principalId = principalId, - principalType = principalType, - success = success, - ipAddress = context.ipAddress, - userAgent = context.userAgent, - ).also { - loginHistoryRepository.save(it) - log.info { "[createHistory] 로그인 이력 저장 완료: principalId=${principalId}, historyId=${it.id}" } - } - }.onFailure { - log.warn { "[createHistory] 로그인 이력 저장 중 예외 발생: message=${it.message} id=${principalId}, type=${principalType}, success=${success}, context=${context}" } - } - } -}