From 68472b234e2530f24234e4452e881cac5ed59157 Mon Sep 17 00:00:00 2001 From: Klaus Date: Fri, 22 Nov 2024 21:22:02 +0900 Subject: [PATCH] =?UTF-8?q?=ED=9A=8C=EC=9B=90=ED=86=A0=ED=81=B0=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC=20-=20Redis=20->=20Valkey=EB=A1=9C=20?= =?UTF-8?q?=EC=9D=B4=EC=A0=84=EB=90=98=EB=8F=84=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/member/CreatorAdminMemberService.kt | 27 +++++++++++++--- .../vividnext/sodalive/jwt/TokenProvider.kt | 25 ++++++++++++--- .../sodalive/member/MemberService.kt | 32 ++++++++++++++++--- ...pository.kt => MemberTokenRepositoryV2.kt} | 2 +- 4 files changed, 72 insertions(+), 14 deletions(-) rename src/main/kotlin/kr/co/vividnext/sodalive/v2/{NewMemberTokenRepository.kt => MemberTokenRepositoryV2.kt} (75%) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/member/CreatorAdminMemberService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/member/CreatorAdminMemberService.kt index 3e193e9..f375108 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/member/CreatorAdminMemberService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/member/CreatorAdminMemberService.kt @@ -7,7 +7,9 @@ import kr.co.vividnext.sodalive.member.MemberRepository import kr.co.vividnext.sodalive.member.MemberRole import kr.co.vividnext.sodalive.member.login.LoginRequest import kr.co.vividnext.sodalive.member.login.LoginResponse +import kr.co.vividnext.sodalive.member.token.MemberToken import kr.co.vividnext.sodalive.member.token.MemberTokenRepository +import kr.co.vividnext.sodalive.v2.MemberTokenRepositoryV2 import org.springframework.beans.factory.annotation.Value import org.springframework.data.repository.findByIdOrNull import org.springframework.security.authentication.UsernamePasswordAuthenticationToken @@ -22,6 +24,7 @@ import kotlin.concurrent.write class CreatorAdminMemberService( private val repository: MemberRepository, private val tokenRepository: MemberTokenRepository, + private val tokenRepositoryV2: MemberTokenRepositoryV2, private val tokenProvider: TokenProvider, private val authenticationManagerBuilder: AuthenticationManagerBuilder, @@ -47,14 +50,30 @@ class CreatorAdminMemberService( val lock = getOrCreateLock(memberId = memberId) lock.write { - val memberToken = tokenRepository.findByIdOrNull(memberId) - ?: throw SodaException("로그인 정보를 확인해주세요.") + val memberToken = saveAndGetTokenById(memberId) - memberToken.tokenSet.remove(token) - tokenRepository.save(memberToken) + if (memberToken != null) { + memberToken.tokenSet.remove(token) + tokenRepositoryV2.save(memberToken) + } } } + private fun saveAndGetTokenById(id: Long): MemberToken? { + var memberToken = tokenRepositoryV2.findByIdOrNull(id = id) + + if (memberToken == null) { + memberToken = tokenRepository.findByIdOrNull(id = id) + + if (memberToken != null) { + tokenRepositoryV2.save(memberToken) + tokenRepository.delete(memberToken) + } + } + + return memberToken + } + private fun login(email: String, password: String): LoginResponse { val member = repository.findByEmail(email = email) ?: throw SodaException("로그인 정보를 확인해주세요.") if (!member.isActive) { diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/jwt/TokenProvider.kt b/src/main/kotlin/kr/co/vividnext/sodalive/jwt/TokenProvider.kt index 0ec16ac..b436ebb 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/jwt/TokenProvider.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/jwt/TokenProvider.kt @@ -13,6 +13,7 @@ import kr.co.vividnext.sodalive.member.MemberAdapter import kr.co.vividnext.sodalive.member.MemberRepository import kr.co.vividnext.sodalive.member.token.MemberToken import kr.co.vividnext.sodalive.member.token.MemberTokenRepository +import kr.co.vividnext.sodalive.v2.MemberTokenRepositoryV2 import org.slf4j.LoggerFactory import org.springframework.beans.factory.InitializingBean import org.springframework.beans.factory.annotation.Value @@ -35,7 +36,8 @@ class TokenProvider( @Value("\${jwt.token-validity-in-seconds}") private val tokenValidityInSeconds: Long, private val repository: MemberRepository, - private val tokenRepository: MemberTokenRepository + private val tokenRepository: MemberTokenRepository, + private val tokenRepositoryV2: MemberTokenRepositoryV2 ) : InitializingBean { private val logger = LoggerFactory.getLogger(TokenProvider::class.java) @@ -65,11 +67,11 @@ class TokenProvider( val lock = getOrCreateLock(memberId = memberId) lock.write { - val memberToken = tokenRepository.findByIdOrNull(memberId) + val memberToken = saveAndGetTokenById(memberId) ?: MemberToken(id = memberId) memberToken.tokenSet.add(token) - tokenRepository.save(memberToken) + tokenRepositoryV2.save(memberToken) } return token @@ -84,7 +86,7 @@ class TokenProvider( .body val authorities = claims[AUTHORITIES_KEY].toString().split(",").map { SimpleGrantedAuthority(it) } - val memberToken = tokenRepository.findByIdOrNull(id = claims.subject.toLong()) + val memberToken = saveAndGetTokenById(id = claims.subject.toLong()) ?: throw SodaException("로그인 정보를 확인해주세요.") if (!memberToken.tokenSet.contains(token)) throw SodaException("로그인 정보를 확인해주세요.") @@ -96,6 +98,21 @@ class TokenProvider( return UsernamePasswordAuthenticationToken(principal, token, authorities) } + private fun saveAndGetTokenById(id: Long): MemberToken? { + var memberToken = tokenRepositoryV2.findByIdOrNull(id = id) + + if (memberToken == null) { + memberToken = tokenRepository.findByIdOrNull(id = id) + + if (memberToken != null) { + tokenRepositoryV2.save(memberToken) + tokenRepository.delete(memberToken) + } + } + + return memberToken + } + fun validateToken(token: String): Boolean { try { Jwts.parserBuilder() diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberService.kt index 82896e4..678b499 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberService.kt @@ -35,9 +35,11 @@ import kr.co.vividnext.sodalive.member.stipulation.StipulationIds import kr.co.vividnext.sodalive.member.stipulation.StipulationRepository import kr.co.vividnext.sodalive.member.tag.MemberCreatorTag import kr.co.vividnext.sodalive.member.tag.MemberTagRepository +import kr.co.vividnext.sodalive.member.token.MemberToken import kr.co.vividnext.sodalive.member.token.MemberTokenRepository import kr.co.vividnext.sodalive.utils.generateFileName import kr.co.vividnext.sodalive.utils.generatePassword +import kr.co.vividnext.sodalive.v2.MemberTokenRepositoryV2 import org.springframework.beans.factory.annotation.Value import org.springframework.data.repository.findByIdOrNull import org.springframework.security.authentication.UsernamePasswordAuthenticationToken @@ -62,6 +64,7 @@ import kotlin.concurrent.write class MemberService( private val repository: MemberRepository, private val tokenRepository: MemberTokenRepository, + private val tokenRepositoryV2: MemberTokenRepositoryV2, private val stipulationRepository: StipulationRepository, private val stipulationAgreeRepository: StipulationAgreeRepository, private val creatorFollowingRepository: CreatorFollowingRepository, @@ -435,11 +438,12 @@ class MemberService( val lock = getOrCreateLock(memberId = memberId) lock.write { - val memberToken = tokenRepository.findByIdOrNull(memberId) - ?: throw SodaException("로그인 정보를 확인해주세요.") + val memberToken = saveAndGetTokenById(memberId) - memberToken.tokenSet.remove(token) - tokenRepository.save(memberToken) + if (memberToken != null) { + memberToken.tokenSet.remove(token) + tokenRepositoryV2.save(memberToken) + } } } @@ -451,7 +455,25 @@ class MemberService( member.pushToken = null val lock = getOrCreateLock(memberId = memberId) - lock.write { tokenRepository.deleteById(memberId) } + lock.write { + tokenRepository.deleteById(memberId) + tokenRepositoryV2.deleteById(memberId) + } + } + + private fun saveAndGetTokenById(id: Long): MemberToken? { + var memberToken = tokenRepositoryV2.findByIdOrNull(id = id) + + if (memberToken == null) { + memberToken = tokenRepository.findByIdOrNull(id = id) + + if (memberToken != null) { + tokenRepositoryV2.save(memberToken) + tokenRepository.delete(memberToken) + } + } + + return memberToken } @Transactional diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/v2/NewMemberTokenRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/v2/MemberTokenRepositoryV2.kt similarity index 75% rename from src/main/kotlin/kr/co/vividnext/sodalive/v2/NewMemberTokenRepository.kt rename to src/main/kotlin/kr/co/vividnext/sodalive/v2/MemberTokenRepositoryV2.kt index 14fe79d..61ae20c 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/v2/NewMemberTokenRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/v2/MemberTokenRepositoryV2.kt @@ -5,4 +5,4 @@ import org.springframework.data.repository.CrudRepository import org.springframework.stereotype.Repository @Repository -interface NewMemberTokenRepository : CrudRepository +interface MemberTokenRepositoryV2 : CrudRepository