IT기술/webflux (reactor)

[WebFlux] 마블 다이어그램(Marble Diagram): 리액티브 프로그래밍의 시각적 도구

후스파 2025. 4. 12. 11:39
반응형

spring webflux reactor

마블 다이어그램은 리액티브 프로그래밍에서 데이터 흐름과 연산자(Operator)의 동작을 시각적으로 표현하는 강력한 도구입니다. 특히 Reactor와 같은 리액티브 라이브러리에서 비동기 데이터 흐름을 이해하고 설계하는 데 큰 도움이 됩니다. 이번 글에서는 마블 다이어그램의 개념, 구성 요소, 그리고 활용 방법에 대해 알아보겠습니다.

마블 다이어그램이란?

마블 다이어그램은 구슬 모양의 도형으로 구성된 도표로, 데이터 흐름과 연산자의 동작을 시간의 흐름에 따라 시각적으로 표현합니다. 이는 복잡한 비동기 로직을 이해하고 설계하는 데 매우 유용한 도구입니다.

마블 다이어그램의 주요 특징

  1. 구슬 모양의 표현
    • 각 구슬은 특정 데이터를 나타내며, 구슬의 흐름은 데이터 스트림을 의미합니다.
  2. Operator 이해
    • 다양한 연산자의 동작 방식을 시각적으로 설명하여 개발자가 쉽게 이해할 수 있도록 돕습니다.
  3. 비동기적 데이터 흐름 표현
    • 비동기 데이터가 시간에 따라 어떻게 처리되는지 직관적으로 보여줍니다.

마블 다이어그램의 구성 요소

  1. Source Flux
    • 데이터 스트림이 시작되는 지점을 나타냅니다.
    • 예: Flux.just(1, 2, 3)은 1, 2, 3을 emit하는 Source Flux입니다.
  2. Emit 데이터
    • Publisher가 Subscriber에게 발행하는 데이터를 나타냅니다.
    • 예: --1--2--3--|는 1, 2, 3이라는 데이터를 emit한 후 종료를 의미합니다.
  3. OnComplete
    • 데이터 스트림이 정상적으로 종료되었음을 나타내며 | 기호로 표시됩니다.
  4. OnError
    • 에러가 발생했음을 나타내며 x 기호로 표시됩니다.
  5. Operator
    • 데이터를 변환하거나 필터링하는 연산자를 나타냅니다.
    • 예: map, filter, flatMap
  6. Upstream과 Downstream
    • Upstream은 데이터가 오는 방향, Downstream은 데이터가 나가는 방향을 의미합니다.
  7. Output Flux
    • 최종적으로 처리된 데이터를 나타내며 Subscriber가 받게 되는 결과를 표현합니다.

마블 다이어그램 활용 예시

Operator 동작 예시

  1. map 연산자
    입력된 데이터를 변환하여 새로운 데이터를 생성합니다.마블 다이어그램:
  2. Input: --1--2--3--| map(x -> x * 2) Output: --2--4--6--|
  3. Flux.just(1, 2, 3) .map(x -> x * 2) .subscribe(System.out::println); // 출력: 2, 4, 6
  4. filter 연산자
    조건에 맞는 데이터만 필터링합니다.마블 다이어그램:
  5. Input: --1--2--3--| filter(x > 1) Output: ----2--3--|
  6. Flux.just(1, 2, 3) .filter(x -> x > 1) .subscribe(System.out::println); // 출력: 2, 3
  7. merge 연산자
    두 개 이상의 Flux를 병합하여 하나의 스트림으로 만듭니다.마블 다이어그램:
  8. Input1: --1--2-----| Input2: ----3--4---| merge() Output: --1-32-4---|
  9. Flux.merge(Flux.just(1, 2), Flux.just(3, 4)) .subscribe(System.out::println); // 출력: 1, 2, 3, 4 (순서 보장 X)

Operator 그룹화

Reactor에서 제공하는 연산자는 기능별로 그룹화되어 있습니다:

  1. 생성 연산자 (Creation Operators)
    데이터를 생성하거나 초기화하는 데 사용됩니다.
    예: just, fromIterable
  2. 변환 연산자 (Transformation Operators)
    데이터를 변환하거나 가공합니다.
    예: map, flatMap
  3. 결합 연산자 (Combination Operators)
    여러 Flux 또는 Mono를 결합합니다.
    예: merge, concat
  4. 에러 처리 (Error Handling)
    에러 발생 시 동작을 정의합니다.
    예: onErrorResume, onErrorReturn

메서드 체이닝

마블 다이어그램은 메서드 체이닝 방식을 통해 여러 Operator를 연결하여 복잡한 로직을 간단히 표현할 수 있습니다.

Flux.just(1, 2, 3)
    .map(x -> x * 2)
    .filter(x -> x > 2)
    .subscribe(System.out::println); // 출력: 4, 6

마블 다이어그램:

Input:     --1--2--3--|
map(*2):    --2--4--6--|
filter(>2): ----4--6---|
Output:     ----4--6---|

결론

마블 다이어그램은 리액티브 프로그래밍에서 데이터 흐름과 Operator 동작 방식을 시각적으로 표현하는 강력한 도구입니다. 이를 통해 복잡한 비동기 로직을 쉽게 이해하고 설계할 수 있으며, API 문서나 코드를 보다 직관적으로 파악할 수 있습니다.

반응형