[Kotlin][JPA] kotlin에서 optional 대신 nullable 사용하기 본문
Java 프로젝트를 할때 필수적으로 Optional을 사용할 수 밖에 없었다.
JPA 에서 findById와 같은 메서드가 Optional 값을 반환하기도 하고, NPE를 피하기 위해서 또한 optional을 적극적으로 사용했다.
Kotlin + Spring 으로 프로젝트를 만들다가 이제 JPA Repository를 사용해야 할 때가 되었는데, 당연히 CRUDRespository 에서 제공하는 findById를 사용하니 java와 동일하게 Optional<>을 사용하여 반환을 하게 된다.
이렇게 되면 testRepository.findById(testId).orElseThrow(() -> new DataNotFounExeption)과 같이 Optional의 메서드들을 사용해야 한다.
Kotlin은 nullable을 따로 처리하기 때문에 굳이 자바의 Optional을 사용하지 않아도 된다.
그렇다면, 어떻게 kotlin에서 JPA를 사용할 수 있을까?
Kotlin을 위한 JPA 확장 메서드 - findByIdOrNull

kotlin 에서는 optional을 사용하지 않기 위해 findByIdOrNull 이라는 확장함수를 제공한다.
구현을 보면 할 수 있지만, 내부적으로 orElse를 불러 처리해준다.
이 메서드를 사용하면,
fun getMemo(memoSn: Long): MemoDto{
val targetMemo = memoRepository.findByIdOrNull(memoSn) ?: throw IllegalStateException("Memo not found")
return MemoDto(targetMemo)
}
위와 같이 optional 없이 JPA 함수를 사용할 수 있다.
Default JPA 메서드 선언하기
그렇다면 respository interface에 디폴트 메서드를 어떻게 nullable 하게 만들 수 있을까?
일반적으로 java에서는 반환 타입을 Optional<Object> 형태로 만들었었다.
kotlin 에서는 아래와 같이 만들어줄 수 있다.
@Repository
interface MemoRepository: JpaRepository<Memo, Long> {
fun findByTitle(title: String): Memo?
}
반환타입에 ? 를 붙여 nullable로 선언해준다.
'Kotlin' 카테고리의 다른 글
[Kotlin] Scope Function (0) | 2024.12.03 |
---|---|
kotlin + Springboot Swagger 적용하기 (0) | 2023.10.01 |
1.1 주생성자 부생성자 (0) | 2023.10.01 |
1. Kotlin + Springboot Entity 생성하기 (0) | 2023.10.01 |