Kotlin: Mono.awaitSingleOrNull()의 non-nullable 반환 문제

Jongho Jeon
Jongho’s Tech Blog
4 min readOct 21, 2022

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.Mono
suspend 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에서 체크할 수 있다.

--

--