[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)
    }

그러면 코드가 이렇게 더 간결해질 수 있다.

 

반응형