- Marble diagrams2023년 11월 05일
- starryeye
- 작성자
- 2023.11.05.:32
Marble Diagram 이란..
projectreactor 의 Reactor 를 사용하면 자주 보이는 다이어그램이다.
Marble Diagram 은 Mono 와 Flux 의 연산자 동작을 시각적으로 보여주기 위함이며,
javadoc 전체에서 쉽게 볼 수 있을 것이다.
Marble Diagram 읽는 법
위의 화살표는 시간의 흐름을 나타낸다.
왼쪽에서 오른쪽 방향으로 시간 순서이다.
위 다이어그램에서 도형은 파이프라인을 지나는 하나의 element 라 보면된다.
세로 선은 onComplete 이벤트를 뜻한다.
C 다이어그램에서는 타임라인에 "X" 표시가 있는데 이는 onError 이벤트가 발생되었음을 나타낸다.
D 다이어그램에서는 타임라인에 element 만 존재하고, 이벤트는 발생하지 않아서 종료 되지 않았음을 뜻한다.
위 다이어그램은 Marble Diagram 의 전체적인 틀을 보여준다.
source Flux 의 element 들이 이벤트에 따라
어떤 연산자(fluxOperator) 를 거쳐서
output Flux 에 element 가 되는 동작을 보여준다.
위 다이어그램을 코드로 본다면..
Flux<T> output = source.fluxOperator(); 가 된다.
이제 기본적인 틀을 알게 되었다.
지금 부터는 실제 연산자를 통해 알아보겠다.
(의도한 순서가 있는 것은 아니고 생각나는 연산자들을 하나씩 알아본다..)
mapmap 연산자는 Java Stream 의 map 연산자와 유사하다.
source publisher 의 element 타입은 T 이고 연산자를 거친 element 타입은 V 가 된다.
따라서, 연산자의 파라미터로는 Function 함수형 인터페이스 구현체(mapper)를 전달해줘야한다.
source publisher 에서 onNext, onComplete 이벤트가 연산자를 거쳐서
그대로 downstream 으로 전달되는 것을 알 수 있다.
justjust 연산자는 sequence 생성 연산자이다.
따라서 source publisher 의 timeline 이 없음을 확인할 수 있다.
intervalinterval 연산자도 just 와 동일하게 sequence 생성 연산자이다.
따라서 자체가 source publisher 가 된다.
subscribe 이벤트가 도착하는 순간
Parallel Scheduler 에 의해 특정 Duration 만큼 씩 기다렸다가 element 를 downstream 으로 전달하게 된다.
collectListcollectList 연산자는
source publisher 가 element 를 쭉 전달하면
내부적으로 element 를 모으고 있다가..
source publisher 가 onComplete 이벤트를 전달하면,
collectList 연산자의 downstream 방향으로..
Mono 로 하나의 리스트를 element 로 전달하면서.. onComplete 이벤트를 전달한다.
doOnNextdoOnNext 연산자에는 처음보는 모양이 있다..
저건 element 가 downstream 으로 전달되기 전에..
부수 효과로서 한번 소비(Consume)되고 downstream 으로 전달된다는 뜻이다.
아래는 위와 비슷한 모양의 의미를 정리한 표이다.어떤 함수형 인터페이스(Runnable, Consumer 등)인지..
어떤 이벤트(onNext, onError 등)의 부수 효과인지..
downstream 으로 전달 전에 실행하는지.. 후에 실행하는지...
등을 모양으로 판별할 수 있다.
subscribeOnsubscribeOn 은
upstream 방향으로 실행 스레드를 결정해주는 연산자로
다이어그램을 보면 색상으로 실행 스레드를 잘 나타내준다.
publishOnpublishOn 연산자는
subscribeOn 과 다르게
downstream 방향으로 실행 스레드를 결정하는 것을 다이어그램에서 쉽게 표현한다.
flatMapflatMap 연산자는
source publisher 가 element 를 보내면 내부의 또다른 publisher 가 subscribe 되고
해당 내부 publisher 의 이벤트가 downstream 으로 전달 됨을 다이어그램으로 쉽게 확인 할 수 있다.
(Java Streams 의 flatMap 을 떠올려 보자)
zipzip 연산자는
여러개의 source 에서 전달하는 element 를 한개씩 취합하여
tuple 로 묶어 downstream 으로 내려보내준다.
cachecache 연산자는...
이제 잘 알것이다. 참 쉽죠?
https://medium.com/@jshvarts/read-marble-diagrams-like-a-pro-3d72934d3ef5
https://projectreactor.io/docs/core/release/reference/#howtoReadMarbles다음글이전글이전 글이 없습니다.댓글