본문 바로가기

[Kotlin][JPA] kotlin에서 optional 대신 nullable 사용하기 본문

Kotlin + SpringBoot

[Kotlin][JPA] kotlin에서 optional 대신 nullable 사용하기

00rigin 2023. 10. 9. 18:36

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 + SpringBoot' 카테고리의 다른 글

kotlin + Springboot Swagger 적용하기  (0) 2023.10.01
1.1 주생성자 부생성자  (0) 2023.10.01
1. Kotlin + Springboot Entity 생성하기  (0) 2023.10.01
Comments