-
Notifications
You must be signed in to change notification settings - Fork 1
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
🔀 :: (entry-238) application fullback method추가 #93
base: develop
Are you sure you want to change the base?
The head ref may contain hidden characters: "feature/entry-238-application-fullback-method\uCD94\uAC00"
Changes from 3 commits
77d9b36
e64b81d
c62765c
7628292
943e2da
03a0cb4
02b94d6
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,8 +1,11 @@ | ||
package hs.kr.equus.application.domain.application.spi | ||
|
||
import hs.kr.equus.application.domain.user.model.User | ||
import hs.kr.equus.application.domain.user.model.UserCache | ||
import java.util.UUID | ||
|
||
interface ApplicationQueryUserPort { | ||
fun queryUserByUserId(userId: UUID): User | ||
fun queryUserByUserId(userId: UUID): User? | ||
|
||
fun queryUserByUserIdInCache(userId: UUID): UserCache? | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
package hs.kr.equus.application.domain.user.model | ||
|
||
import java.util.* | ||
|
||
data class UserCache ( | ||
val id: UUID, | ||
val phoneNumber: String, | ||
val name: String, | ||
val isParent: Boolean, | ||
val receiptCode: Long?, | ||
val role: String, | ||
val ttl: Long | ||
) |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,6 +1,8 @@ | ||
package hs.kr.equus.application.domain.user.domain | ||
|
||
import hs.kr.equus.application.domain.user.domain.repository.UserCacheRepository | ||
import hs.kr.equus.application.domain.user.model.User | ||
import hs.kr.equus.application.domain.user.model.UserCache | ||
import hs.kr.equus.application.domain.user.spi.UserPort | ||
import hs.kr.equus.application.global.feign.client.UserClient | ||
import org.springframework.stereotype.Component | ||
|
@@ -9,15 +11,31 @@ import java.util.UUID | |
@Component | ||
class UserPersistenceAdapter( | ||
private val userClient: UserClient, | ||
private val userCacheRepository: UserCacheRepository | ||
) : UserPort { | ||
override fun queryUserByUserId(userId: UUID): User { | ||
return userClient.getUserInfoByUserId(userId).run { | ||
override fun queryUserByUserId(userId: UUID): User? { | ||
return userClient.getUserInfoByUserId(userId)?.let { | ||
User( | ||
id = id, | ||
phoneNumber = phoneNumber, | ||
name = name, | ||
isParent = isParent, | ||
id = it.id, | ||
phoneNumber = it.phoneNumber, | ||
name = it.name, | ||
isParent = it.isParent, | ||
) | ||
} | ||
} | ||
|
||
override fun queryUserByUserIdInCache(userId: UUID): UserCache? { | ||
return userCacheRepository.findById(userId) | ||
.map { | ||
UserCache( | ||
id = it.id, | ||
phoneNumber = it.phoneNumber, | ||
name = it.name, | ||
isParent = it.isParent, | ||
receiptCode = it.receiptCode, | ||
role = it.role.name, | ||
ttl = it.ttl | ||
) | ||
Comment on lines
+30
to
+38
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
만약 - role = it.role.name,
+ role = it.role, 또는 - role = it.role.name,
+ role = it.role.toString(),
|
||
}.orElse(null) | ||
} | ||
Comment on lines
+27
to
+40
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion 새로운
캐시 미스 시 로깅을 추가하는 예시: override fun queryUserByUserIdInCache(userId: UUID): UserCache? {
return userCacheRepository.findById(userId)
.map {
UserCache(
// ... (현재 매핑 로직)
)
}.orElse(null)
.also { if (it == null) logger.debug("Cache miss for user ID: $userId") }
} |
||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
package hs.kr.equus.application.domain.user.domain.entity | ||
|
||
import hs.kr.equus.application.global.security.jwt.UserRole | ||
import org.springframework.data.annotation.Id | ||
import org.springframework.data.redis.core.RedisHash | ||
import org.springframework.data.redis.core.TimeToLive | ||
import java.util.* | ||
|
||
@RedisHash(value = "status_cache") | ||
class UserCacheRedisEntity ( | ||
@Id | ||
val id: UUID, | ||
val phoneNumber: String, | ||
val name: String, | ||
val isParent: Boolean, | ||
val receiptCode: Long?, | ||
val role: UserRole, | ||
@TimeToLive | ||
val ttl: Long | ||
) | ||
Comment on lines
+11
to
+20
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion 일부 속성에 대한 유효성 검사 어노테이션 추가를 고려해보세요. 몇몇 속성에 대해 유효성 검사 어노테이션을 추가하면 데이터의 무결성을 보장하는 데 도움이 될 수 있습니다. 예를 들어: import javax.validation.constraints.NotBlank
import javax.validation.constraints.Pattern
class UserCacheRedisEntity(
@Id
val id: UUID,
@NotBlank
@Pattern(regexp = "^\\d{11}$", message = "전화번호는 11자리 숫자여야 합니다")
val phoneNumber: String,
@NotBlank
val name: String,
val isParent: Boolean,
val receiptCode: Long?,
val role: UserRole,
@TimeToLive
val ttl: Long
) 이렇게 하면 |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
package hs.kr.equus.application.domain.user.domain.repository | ||
|
||
import hs.kr.equus.application.domain.user.domain.entity.UserCacheRedisEntity | ||
import org.springframework.data.repository.CrudRepository | ||
import java.util.UUID | ||
|
||
interface UserCacheRepository : CrudRepository<UserCacheRedisEntity, UUID> { | ||
} |
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -1,15 +1,48 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
package hs.kr.equus.application.global.feign.client | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import hs.kr.equus.application.domain.status.spi.StatusPort | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import hs.kr.equus.application.domain.user.model.UserCache | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import hs.kr.equus.application.domain.user.spi.UserPort | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import hs.kr.equus.application.global.feign.client.dto.response.StatusInfoElement | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import hs.kr.equus.application.global.feign.client.dto.response.UserInfoElement | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import hs.kr.equus.application.global.security.jwt.UserRole | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import org.springframework.cloud.openfeign.FeignClient | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import org.springframework.context.annotation.Lazy | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import org.springframework.stereotype.Component | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import org.springframework.web.bind.annotation.GetMapping | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import org.springframework.web.bind.annotation.PathVariable | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import java.util.UUID | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@FeignClient(name = "UserClient", url = "\${url.user}") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@FeignClient(name = "UserClient", url = "\${url.user}", fallback = UserFallBack::class) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
interface UserClient { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@GetMapping("/user/{userId}") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
fun getUserInfoByUserId( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@PathVariable("userId") userId: UUID, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
): UserInfoElement | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
): UserInfoElement? | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@Component | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
class UserFallBack( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@Lazy private val userPort: UserPort | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion @lazy 어노테이션 사용의 필요성 검토
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) : UserClient { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
override fun getUserInfoByUserId(userId: UUID): UserInfoElement? { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
val user = userPort.queryUserByUserIdInCache(userId) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return user?.let { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
UserInfoElement( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
id = it.id, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
isParent = it.isParent, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
phoneNumber = it.phoneNumber, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
name = it.name, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
role = UserRole.valueOf(it.role) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. UserRole 변환 시 예외 처리 필요
다음과 같이 수정하여 예외 발생을 방지할 수 있습니다: - role = UserRole.valueOf(it.role)
+ role = UserRole.values().find { role -> role.name == it.role } ?: UserRole.USER 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} ?: UserInfoElement( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
id = userId, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
phoneNumber = "", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
name = "", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
isParent = false, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
role = UserRole.USER | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion 사용자 미조회 시 기본값 반환에 대한 위험성 캐시에서 사용자를 찾지 못한 경우 기본값을 가진 다음과 같이 코드를 수정하는 것을 제안합니다: return user?.let {
UserInfoElement(
id = it.id,
isParent = it.isParent,
phoneNumber = it.phoneNumber,
name = it.name,
role = UserRole.valueOf(it.role)
)
- } ?: UserInfoElement(
- id = userId,
- phoneNumber = "",
- name = "",
- isParent = false,
- role = UserRole.USER
- )
+ } ?: null 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
💡 Codebase verification
queryUserByUserId
메서드의 null 처리 미흡queryUserByUserId
메서드의 반환 타입이User
에서User?
로 변경됨에 따라, 일부 호출부에서 null 체크가 제대로 이루어지지 않았습니다. 다음 위치에서 null 처리를 추가해주세요:application-domain/src/test/kotlin/hs/kr/equus/application/domain/application/service/CheckTelServiceTest.kt
application-domain/src/main/kotlin/hs/kr/equus/application/domain/application/usecase/GetApplicationUseCase.kt
application-domain/src/main/kotlin/hs/kr/equus/application/domain/application/usecase/CreateApplicationUseCase.kt
application-domain/src/main/kotlin/hs/kr/equus/application/domain/application/service/CheckTelService.kt
🔗 Analysis chain
queryUserByUserId
메서드의 반환 타입 변경에 따른 영향 확인 필요queryUserByUserId
메서드의 반환 타입이User
에서User?
로 변경되었습니다. 이로 인해 이 메서드를 호출하는 모든 부분에서 null 처리 로직이 필요합니다. 기존 코드에서 이 변경으로 인해 발생할 수 있는 문제를 방지하기 위해 호출부에서 null 체크가 제대로 이루어졌는지 확인해주세요.다음 스크립트를 실행하여 해당 메서드의 호출부를 찾아서 null 처리가 되어 있는지 확인할 수 있습니다:
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
Length of output: 5771