Mono
Spring Webflux 의 Reactive Stream 를 구현하고 있는 Reactor 는 Mono
와 Flux
이다.
그 중 Mono
는 0 ~ 1 개의 데이터를 전달 하는 역할을 한다.
Mono 인스턴스 생성 방식
Just
.just()
는 구독하는 순간. 특정 값을 바로 반환emit
하는 함수이다.- 인스턴스화 되는 시점(
instantiation time
) 에 캡쳐되는 값을 반환한다. (eager
방식과 유사)
Defer
.defer()
는Mono Supplier
를 인자로 받아 구독하는 순간, 해당 Supplier 를 구독하여emit
하는 함수이다..just()
와의 차이점은 해당 값이 인스턴스화 되는 시점 은 구독하는 순간 이다.
Callable
.fromCallable()
는Callable Supplier
를 인자로 받아Mono Supplier
인스턴스를 생성하는 함수이다.- 생성된
Mono Supplier
를 구독하는 순간,Callable Supplier
를 통해 단순 값 을 제공받아emit
한다.
var data = 99;
private fun getData(caller: String): Int {
println("Called by $caller")
return data
}
@Test
fun monoInstantiationTest() {
println("==========================")
println(getData("HI"))
println("==========================")
val just = Mono.just(getData("JUST"))
val defer = Mono.defer { Mono.just(getData("DEFER")) }
val callable = Mono.fromCallable { getData("CALLABLE") }
just.subscribe { println("JUST data : $it") }
defer.subscribe { println("DEFER data : $it") }
callable.subscribe { println("CALLABLE data : $it") }
println("==========================")
// changed value
println("Changed value $data -> ${++data}")
println("==========================")
just.subscribe { println("JUST data : $it") }
defer.subscribe { println("DEFER data : $it") }
callable.subscribe { println("CALLABLE data : $it") }
println("==========================")
}
==========================
Called by HI
99
==========================
Called by JUST
JUST data : 99
Called by DEFER
DEFER data : 99
Called by CALLABLE
CALLABLE data : 99
==========================
Changed value 99 -> 100
==========================
JUST data : 99
Called by DEFER
DEFER data : 100
Called by CALLABLE
CALLABLE data : 100
==========================