티스토리 뷰

Java+Spring/WebFlux

[WebFlux]Mono, Flux

Vagabund.Gni 2023. 3. 28. 10:08
728x90
반응형

목차

     

    지난 글에선 리액티브 선언문과, 그에 맞춰 개발 및 통합이 진행 중인 리액티브 스트림에 대해 훑었다.

     

    2023.03.25 - [Development/WebFlux] - [WebFlux]리액티브 스트림(Reactive Streams)

     

    [WebFlux]리액티브 스트림(Reactive Streams)

    원래 계획은 리액티브 스트림에 이어서 모노, 플럭스까지 정리하는 거였지만, 하나도 모르는 내가 한 번에 몰아 정리하기는 불가능하다는 판단이 들어 글을 나누었다. 읽고, 실습해도 이상하게

    gnidinger.tistory.com

    또한 리액티브 스트림의 구현체중 하나인 프로젝트 리액터와, 그 구현체인 스프링 웹플럭스에 대해서도 언급했다.

     

    이 글에서는 웹플럭스 내부의 인터페이스 중 Publisher를 구현한 두 가지 클래스, 모노와 플럭스에 대해 알아보자.

     

    Mono, Flux

     

    위에서 언급했듯이 두 클래스는 프로젝트 리액터의 Publisher를 구현한 클래스이다.

     

    인터페이스의 이름 그대로 데이터를 발행하기 위해 만들어진 클래스이며, 당연히 해당 데이터는 비동기로 발행된다.

     

    실제 사용해 본 후기는 기존의 객체를 감싸서 사용하는 느낌이었다.

     

    공통점과 차이점에 대해 알기 전에, 모노와 플럭스에 대한 정의부터 내리고 가자.

     

    • Mono - 0, 또는 1개의 데이터를 발행하고 처리해 해당 결과를 반환하는 리액티브 스트림. Future와 비슷하게 비동기 작업의 결과를 한 번만 반환한다. 블로킹 혹은 네트워크 작업 등을 비동기적으로 처리할 수 있다.
    • Flux - 0보다 큰 데이터를 발행하고 처리해 해당 결과를 반환하는 리액티브 스트림. Iterator와 비슷하게 여러 개의 결과를 순차적으로 반환할 수 있다. 여기서 순차적이라는 의미는 비동기 처리를 하지 않는다는 말이 아니라 데이터 소스로부터 결과가 하나씩 도착하며, Flux가 이 데이터를 받는 즉시 비동기로 처리한다는 것을 의미한다.
    • subscribeOn() - 리액티브 스트림을 구독하는 메서드. 구독 시 데이터를 생성하는 스레드를 지정하는 역할을 한다.
    • publishOn() - 리액티브 스트림을 구독하는 메서드. 데이터를 처리하는 스레드를 지정하는 역할을 한다.

     

    추가로 웹플럭스에서는 아래와 같은 마블 다이어그램을 공식문서를 포함해 자주 사용하며,

     

    위 그림은 하나의 데이터를 발행하는 Mono 스트림에 대한 그림이다.

     

    당연히 추측할 수 있겠지만 Flux 스트림에 대한 다이어그램은 아래와 같이 그려진다.

     

     

    추가로 Flux가 흔히 한 개 이상의 데이터를 발행한다고 적혀 있지만 

    Flux<String> stringFlux = Flux.empty();

    와 같이 데이터가 없는 Flux도 얼마든지 생성 가능하다.

     

    계속해서 모노와 플럭스의 공통점과 차이점에 대해 조금 더 자세히 정리하고 가자.

     

    Common

     

    1. 리액티브 프로그래밍 지원
      모노와 플럭스는 블로킹 없는 비동기적인 데이터 스트림을 다룰 때 사용된다. 이는 기존의 방법으로는 구현이 어려웠던, 함수형 패러다임인 리액티브 프로그래밍을 비교적 쉽게 구현할 수 있게 도와준다.
    2. 구독 방식
      모노와 플럭스는 둘 다 구독자의 구독이 발생하기 전까진 데이터를 발행하지 않고 기다린다.
    3. 데이터 처리 방식
      위에도 적었듯 모노와 플럭스는 함수형 프로그래밍에서 사용하는 map(), flatMap() 등의 고차 함수(스트림 연산자)를 사용한다. 또한 이를 통해 데이터를 한 번에 하나씩 비동기적으로 처리함으로써 불변성과 스레드 안정성을 보장한다.
    4. 에러 핸들링
      모노와 플럭스는 데이터 처리 스트림 중에 발생하는 에러에 대한 처리 기능을 제공한다. 이를 사용하는 데는 비동기 처리에 대한 이해가 조금 더 필요하지만, 잘 다루게 된다면 섬세한 에러 핸들링이 가능하다.
    5. Hot/Cold 스트림 지원
      모노와 플럭스는 Hot/Cold 스트림을 모두 지원한다. 아래에 이어서 적겠지만 Hot 스트림이란 구독 전에 데이터가 발생하는 스트림이며 Cold 스트림은 구독이 발생할 때마다 데이터 스트림을 새로 생성하는 스트림을 가리킨다.

     

    Hot Stream & Cold Stream

     

    두 스트림은 리액티브 스트림에서 사용되는 일종의 데이터 스트림이라고 보면 된다.

     

    그 차이는 대략 아래와 같다.

     

    1. Cold Stream
      구독이 발생할 때마다 데이터 스트림을 처음부터 새로 생성. 때문에 데이터 전달 속도를 조절할 수 있으며 구독자간 독립적인 데이터 스트림을 보장한다.

    2. Hot Stream
      생산자가 독립적으로 데이터 스트림 생성. 끊임없이 데이터를 생성하며 구독자가 스트림에 접속하면 그 부분부터 데이터를 받게 된다. 구독자 없이도 데이터를 발행하기 때문에 구독자 별로 받는 데이터가 다를 가능성이 있다. Hot Stream은 유튜브 스트리밍과 같은 이벤트 스트림에 사용되며, 빠른 처리와 동시성에 강점이 있다.

     

     

    Difference

     

    1. 데이터의 개수
      모노는 0, 1개의 데이터를 다루며 Flux는 0개 이상의 데이터를 다룬다.
    2. 완료 처리
      모노는 단일요소를 다루므로 처리 후 즉시 완료된다.
      하지만 플럭스는 여러 요소를 다룰 수 있기 때문에, 모든 요소를 처리한 후에 완료된다.
    3. 에러 핸들링
      단일 요소를 다루는 모노는 에러가 발생하면 해당 에러를 처리하기 위한 메서드가 호출되고 종료된다.
      플럭스 역시 메서드 호출 후 종료되지만 에러 발생 이후에도 데이터를 발행할 수 있다. 이 경우 에러는 스트림 안에 포함되며, 이를 통해 스트림과 에러를 한 번에 처리할 수 있다. 
    반응형
    댓글
    공지사항
    최근에 올라온 글
    최근에 달린 댓글
    Total
    Today
    Yesterday
    링크
    «   2025/01   »
    1 2 3 4
    5 6 7 8 9 10 11
    12 13 14 15 16 17 18
    19 20 21 22 23 24 25
    26 27 28 29 30 31
    글 보관함