[SpringBoot]
코틀린 확장함수 이용해서 JpaRepository 사용하기
Hevton
2023. 3. 30. 12:06
반응형
코틀린으로 작성한 이러한 함수가 있다.
@Transactional
fun updateUserName(request: UserUpdateRequest) {
val user = userRepository.findById(request.id).orElseThrow(::IllegalArgumentException)
user.updateName(request.name)
}
우리가 JpaRepository에서 @PrimaryKey 이외에 추가로 정의한
findByName() 같은 함수가 있다면
fun findByName(name: String): User?
이렇게 반환형으로 Null Safety를 이용해 줄 수 있지만, findById처럼 JpaRepository에서 기본제공해주는 함수는 아직 JAVA 이므로
Null Safety의 개념이 없기에 Optional<User> 를 반환해 줄 수 밖에 없다.
이를 코틀린에 맞게 익스텐션으로 정의해준 함수가 있다!
@Transactional
fun updateUserName(request: UserUpdateRequest) {
// 이런 함수를 제공해준다.
val user = userRepository.findByIdOrNull(request.id)?: fail()
user.updateName(request.name)
}
findByIdOrNull() 함수는 Null을 반환해 줄 수 있다. 따라서 엘비스 연산자 ( ?: ) 를 활용할 수 있게 된다.
여기서 fail() 은 다음과 같이 정의했다.
ExceptionUtils.kt
fun fail(): Nothing {
throw IllegalArgumentException()
}
여기서 우리가 코틀린의 확장함수 정의하는 방법을 이용해서 새로 함수를 더 압축해서 정의해 줄 수도 있다.
ExceptionUtils.kt
fun fail(): Nothing {
throw IllegalArgumentException()
}
fun <T, ID> CrudRepository<T, ID>.findByIdOrThrow(id: ID): T {
return this.findByIdOrNull(id)?: fail()
}
findByIdOrThrow 라는 함수를 우리가 확장함수로 정의해 준 것이다.
@Transactional
fun updateUserName(request: UserUpdateRequest) {
// 코틀린의 확장함수를 더 활용해서 우리가 이런 함수를 만들어 줄 수도 있다.
val user = userRepository.findByIdOrThrow(request.id)
user.updateName(request.name)
}
그러면 코드가 이렇게 더 간결해질 수 있다.
반응형