[스프링][kotlin][Reactor] zipWith 알아보기

프로그래밍/서버2021. 5. 1. 19:56
public final <T2,O> Mono<O> zipWith(Mono<? extends T2> other,
                                    BiFunction<? super T,? super T2,? extends O> combinator)

Reactor의 Mono에서 사용가능한 zipWith 함수에 대해 알아보겠습니다. 바로 위의 함수입니다.

 

위 사진이 zipWith 함수가 하는 일을 잘 보여줍니다.

초록색 A와 황색 1은 각각의 Mono에서 발생되는 값입니다. 시간이 흐름에 따라 Mono 값이 발생하며 정상적으로 Mono가 종료되는 것은 검은색 세로 선으로 표시됩니다.

 

반응형으로 코드를 짜는 경우 서로 다른 두 Mono가 완료되는 시점에 특정 동작을 하는 것은 흔한 일인 것 같습니다.

예를 들어 어떤 함수에선 외부의 User 서비스에 유저 정보를 요청하고 또 다른 외부 Item 서비스에 아이템 정보를 요청한 뒤 이를 조합하여 리턴할 수 있습니다. 그런데 네트워크의 상황에 따라 User 서비스의 리턴 값을 먼저 받기도 하고 아니면 Item 서비스의 리턴 값을 먼저 받을 수도 있습니다. 이런 상황에서 zipWith 함수를 이용하면 유용합니다.

 

zipWith 함수를 이용하면 서로 다른 두 Mono가 완료되는 시점에 이 두 내용을 조작하여 하나의 Mono를 발생 시킬 수 있습니다.

 

return aMono.zipWith(bMono) { a, b -> a + b }

코틀린의 람다 표현식에서 인자 부분에는 소괄호가 없는 것을 유의하며 코드를 작성해주면 됩니다.

 

 

 

참고

projectreactor.io/docs/core/release/api/reactor/core/publisher/Mono.html

 

Mono (reactor-core 3.4.5)

static  Mono using(Callable  resourceSupplier, Function > sourceSupplier, Consumer  resourceCleanup, boolean eager) Uses a resource, generated by a supplier for each individual Subscriber, while streaming the value from a Mono derived from the same re

projectreactor.io

kotlinlang.org/docs/lambdas.html#instantiating-a-function-type

 

High-order functions and lambdas | Kotlin

 

kotlinlang.org

 

작성자

Posted by 드리머즈

관련 글

댓글 영역