Kotlin: Mono.awaitSingleOrNull()의 non-nullable 반환 문제
Overview
Spring Webflux 등을 사용한다면 Java Reactor Core 라이브러리를 사용하게 될 것이다.만약 Java가 아닌 Kotlin을 사용하고 있다면, Kotlin Coroutine을 사용하여 Reactor Core와 호환되는 더 가독성 좋은 코드를 작성할 수 있다.
이 때 사용하는 API 중 하나가 awaitSingleOrNull()
이라는 메소드인데, 라이브러리 버전이 낮으면 non-nullable 타입을 return하는 이슈가 있다.
kotlinx-coroutines-reactor
awaitSingleOrNull()
라는 extension method는 kotlinx-coroutines-reactor
라는 모듈에서 제공된다.
Gradle(Kotlin DSL)에서 다음과 같이 의존성을 추가하여 사용한다
dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-reactor:1.6.4")
}
사용 방법은 아래와 같다.
import kotlinx.coroutines.reactive.awaitSingleOrNull
import reactor.core.publisher.Monosuspend fun main(args: Array<String>) {
val num: Int = Mono.just(1).awaitSingleOrNull()
}
num이라는 변수가 Int라는 non-nullable 타입으로 선언되어 있어서 컴파일이 실패해야 한다. 하지만 kotlinx-coroutines-reactor 1.4.3 이하 버전에서는 컴파일이 가능하다. (버그다)
위 이슈이고, 1.5.0에서 해결되었다.
1.5.0 버전은 2021년 5월에 release되었다.
Conclusion
kotlinx-coroutines-reactor 의존성을 사용하고 있다면 최소한 1.5.0 이상을 사용하도록 하자. NullPointerException을 compile time에서 체크할 수 있다.