마블 다이어그램

jjunhwan.kim·2023년 12월 17일
0

스프링

목록 보기
9/10
post-thumbnail
post-custom-banner

개요

  • 마블 다이어그램을 통해 Reactor의 Publisher와 Subscriber를 알아봅니다.

마블 다이어그램이란?

  • 마블 다이어그램은 여러 가지 구슬 모양의 도형으로 구성된 도표입니다.
  • Reactor에서 지원하는 Operator를 이해하는데 중요한 역할을 합니다.
  • 아래는 Reactor Reference Guide 문서의 Appendix B: How to read marble diagrams? 에서 설명하고 있는 마블 다이어그램입니다. (https://projectreactor.io/docs/core/release/reference)

  1. 1번에서 가리키는 수평으로 된 검은 선은 타임라인입니다. Publisher가 데이터를 emit하는 타임라인입니다. 타임라인의 시간은 왼쪽에서 오른쪽으로 흐릅니다. Publisher는 데이터 소스를 최초로 emit하는 Publisher일 수도 있고 Operator 함수를 기준으로 상위에 있는 Publisher 일 수도 있습니다. 따라서 정리하면 Upstream의 Publisher를 나타냅니다.

  2. Publisher가 emit하는 데이터를 의미합니다. 가장 왼쪽의 구슬이 가장 먼저 emit된 데이터입니다.

  3. 수직으로 된 검은색 바는 데이터의 emit이 정상적으로 종료되었음을 의미합니다. 따라서 onComplete Signal이 전송됩니다. (Subscriber의 onComplete 메서드가 호출됩니다.)

  4. Operator 함수쪽으로 들어가는 점선 화살표는 Publisher로 부터 emit된 데이터가 Operator 함수의 입력으로 전달되는 것을 의미합니다.

  5. Publisher로부터 전달받은 데이터를 처리하는 Operator 함수입니다. Reactor는 많은 수의 Operator를 지원하고 각 Operator마다 해당 Operator를 설명하는 마블 다이어그램을 가집니다.

  6. Operator 함수에서 나가는 점선 화살표는 Publisher로부터 전달받은 데이터를 가공한 후에 출력으로 내보내는 것을 의미합니다.

  7. 7번에서 가리키는 수평으로 된 검은 선은 타임라인입니다. Operator 함수에서 가공되어 출력으로 내보내진 데이터의 타임라인입니다.

  8. Operator 함수에서 가공된 데이터를 의미합니다.

  9. 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로 리턴하는 것을 볼 수 있습니다.

post-custom-banner

0개의 댓글