개요
- 마블 다이어그램을 통해 Reactor의 Publisher와 Subscriber를 알아봅니다.
마블 다이어그램이란?
-
1번에서 가리키는 수평으로 된 검은 선은 타임라인입니다. Publisher가 데이터를 emit하는 타임라인입니다. 타임라인의 시간은 왼쪽에서 오른쪽으로 흐릅니다. Publisher는 데이터 소스를 최초로 emit하는 Publisher일 수도 있고 Operator 함수를 기준으로 상위에 있는 Publisher 일 수도 있습니다. 따라서 정리하면 Upstream의 Publisher를 나타냅니다.
-
Publisher가 emit하는 데이터를 의미합니다. 가장 왼쪽의 구슬이 가장 먼저 emit된 데이터입니다.
-
수직으로 된 검은색 바는 데이터의 emit이 정상적으로 종료되었음을 의미합니다. 따라서 onComplete Signal이 전송됩니다. (Subscriber의 onComplete 메서드가 호출됩니다.)
-
Operator 함수쪽으로 들어가는 점선 화살표는 Publisher로 부터 emit된 데이터가 Operator 함수의 입력으로 전달되는 것을 의미합니다.
-
Publisher로부터 전달받은 데이터를 처리하는 Operator 함수입니다. Reactor는 많은 수의 Operator를 지원하고 각 Operator마다 해당 Operator를 설명하는 마블 다이어그램을 가집니다.
-
Operator 함수에서 나가는 점선 화살표는 Publisher로부터 전달받은 데이터를 가공한 후에 출력으로 내보내는 것을 의미합니다.
-
7번에서 가리키는 수평으로 된 검은 선은 타임라인입니다. Operator 함수에서 가공되어 출력으로 내보내진 데이터의 타임라인입니다.
-
Operator 함수에서 가공된 데이터를 의미합니다.
-
X 표시는 에러가 발생해 데이터 처리가 종료되었음을 의미합니다. 따라서 onError Signal이 전송됩니다. (Subscriber의 onError 메서드가 호출됩니다.)
Mono 마블 다이어그램
아래는 Reactor Core Javadoc 문서의 Mono의 마블 다이어그램입니다. (https://projectreactor.io/docs/core/release/api)
- Mono는 0개 또는 1개의 데이터를 emit하는 Publisher입니다.
- 1개의 데이터가 emit될 경우 다이어그램의 구슬 데이터가 emit되면서 onNext Signal, onComplete Signal이 차례로 전송됩니다.
- 0개의 데이터가 emit될 경우, 즉 구슬 데이터가 emit되지 않는 경우 onComplete Signal만 전송됩니다.
아래와 같이 테스트 코드를 작성하여 실행하면, onNext, onComplete 람다식이 실행되는 것을 볼 수 있습니다.
- just Operator를 사용하여 소스 데이터를 Publisher에게 전달합니다.
- subscribe 메서드는 세 개의 람다식을 파라미터로 받습니다.
- 첫 번째 람다식은 Publisher가 onNext Signal을 전송하면 실행됩니다. 즉 Subscriber가 Publisher로부터 데이터를 전달받기 위해 사용됩니다.
- 두 번째 람다식은 Publisher가 onError Signal을 전송하면 실행됩니다. Publisher가 데이터 전송시 에러가 발생할 경우 해당 에러를 Exception 형태로 전달합니다.
- 세 번째 람다식은 Publisher가 onComplete Signal을 전송하면 실행됩니다. 이를 통해 데이터 emit이 종료되었음을 알 수 있습니다.
아래와 같이 테스트 코드를 작성하여 실행하면, onComplete 람다식만 실행되는 것을 볼 수 있습니다.
- empty Operator를 사용하여 데이터를 emit하지 않아 onComplete Signal만 전송됩니다.
- subscribe 메서드로 전달된 세 번째 람다식만 실행되는 것을 볼 수 있습니다.
Flux 마블 다이어그램
아래는 Reactor Core Javadoc 문서의 Flux의 마블 다이어그램입니다.
- Flux는 0개 또는 N개의 데이터를 emit하는 Publisher입니다. 따라서 Mono의 데이터 emit 범위를 포함합니다.
- 마블 다이어그램을 보면 emit되는 구슬 모양의 데이터가 여러 개 있는 것을 볼 수 있습니다.
아래와 같이 테스트 코드를 작성하여 실행하면 여러 onNext 람다식이 실행되고 onComplete 람다식이 실행되는 것을 볼 수 있습니다.
- fromArray Operator를 사용하여 배열을 Publisher에게 전달합니다.
- 배열의 원소를 차례대로 emit하면 filter Operator에서 배열의 원소를 전달받아 6보다 큰 숫자만 필터링 한 후 다시 map Operator에서 2를 곱하여 전달합니다.
아래와 같이 테스트 코드를 작성하여 실행하면 두 개의 데이터를 연결해서 Flux로 변환합니다.
- Mono의 just Operator는 파라미터의 값으로 null을 허용하지 않습니다.
- Mono의 justOrEmpty Operator는 파라미터 값으로 null이 전달되면 empty Operator를 호출하고 null이 아니면 전달된 값을 사용합니다.
- concatWith Operator는 concatWith를 호출한 Publisher와 파라미터로 전달된 Publisher가 각각 emit하는 데이터들을 하나로 연결해서 새로운 Publisher로 만들어 주는 Operator입니다.
- 아래 concatWith의 마블 다이어그램을 보면 두 Publisher의 데이터를 하나로 합쳐 Flux로 리턴하는 것을 볼 수 있습니다.
아래와 같이 테스트 코드를 작성하여 실행하면 여러 Publisher의 데이터를 연결해서 Flux로 변환합니다.
- collectList Operator를 사용하면 emit하는 데이터를 모아서 List의 원소로 포함시켜 하나의 List만 emit하는, 여러 원소를 가진 하나의 리스트를 리턴하는 Mono를 리턴합니다.
- 따라서 첫 번째 결과는 Flux의 각각의 데이터를 콘솔에 출력하지만 두 번째 결과는 하나의 리스트만 콘솔에 출력합니다.
- 아래는 concat의 마블 다이어그램입니다. 여러 개의 Publisher의 데이터를 하나로 합쳐 Flux로 리턴하는 것을 볼 수 있습니다.