티스토리 뷰
목차
지난 글에선 리액티브 선언문과, 그에 맞춰 개발 및 통합이 진행 중인 리액티브 스트림에 대해 훑었다.
2023.03.25 - [Development/WebFlux] - [WebFlux]리액티브 스트림(Reactive Streams)
또한 리액티브 스트림의 구현체중 하나인 프로젝트 리액터와, 그 구현체인 스프링 웹플럭스에 대해서도 언급했다.
이 글에서는 웹플럭스 내부의 인터페이스 중 Publisher를 구현한 두 가지 클래스, 모노와 플럭스에 대해 알아보자.
Mono, Flux
위에서 언급했듯이 두 클래스는 프로젝트 리액터의 Publisher를 구현한 클래스이다.
인터페이스의 이름 그대로 데이터를 발행하기 위해 만들어진 클래스이며, 당연히 해당 데이터는 비동기로 발행된다.
실제 사용해 본 후기는 기존의 객체를 감싸서 사용하는 느낌이었다.
공통점과 차이점에 대해 알기 전에, 모노와 플럭스에 대한 정의부터 내리고 가자.
- Mono - 0, 또는 1개의 데이터를 발행하고 처리해 해당 결과를 반환하는 리액티브 스트림. Future와 비슷하게 비동기 작업의 결과를 한 번만 반환한다. 블로킹 혹은 네트워크 작업 등을 비동기적으로 처리할 수 있다.
- Flux - 0보다 큰 데이터를 발행하고 처리해 해당 결과를 반환하는 리액티브 스트림. Iterator와 비슷하게 여러 개의 결과를 순차적으로 반환할 수 있다. 여기서 순차적이라는 의미는 비동기 처리를 하지 않는다는 말이 아니라 데이터 소스로부터 결과가 하나씩 도착하며, Flux가 이 데이터를 받는 즉시 비동기로 처리한다는 것을 의미한다.
- subscribeOn() - 리액티브 스트림을 구독하는 메서드. 구독 시 데이터를 생성하는 스레드를 지정하는 역할을 한다.
- publishOn() - 리액티브 스트림을 구독하는 메서드. 데이터를 처리하는 스레드를 지정하는 역할을 한다.
추가로 웹플럭스에서는 아래와 같은 마블 다이어그램을 공식문서를 포함해 자주 사용하며,
위 그림은 하나의 데이터를 발행하는 Mono 스트림에 대한 그림이다.
당연히 추측할 수 있겠지만 Flux 스트림에 대한 다이어그램은 아래와 같이 그려진다.
추가로 Flux가 흔히 한 개 이상의 데이터를 발행한다고 적혀 있지만
Flux<String> stringFlux = Flux.empty();
와 같이 데이터가 없는 Flux도 얼마든지 생성 가능하다.
계속해서 모노와 플럭스의 공통점과 차이점에 대해 조금 더 자세히 정리하고 가자.
Common
- 리액티브 프로그래밍 지원
모노와 플럭스는 블로킹 없는 비동기적인 데이터 스트림을 다룰 때 사용된다. 이는 기존의 방법으로는 구현이 어려웠던, 함수형 패러다임인 리액티브 프로그래밍을 비교적 쉽게 구현할 수 있게 도와준다. - 구독 방식
모노와 플럭스는 둘 다 구독자의 구독이 발생하기 전까진 데이터를 발행하지 않고 기다린다. - 데이터 처리 방식
위에도 적었듯 모노와 플럭스는 함수형 프로그래밍에서 사용하는 map(), flatMap() 등의 고차 함수(스트림 연산자)를 사용한다. 또한 이를 통해 데이터를 한 번에 하나씩 비동기적으로 처리함으로써 불변성과 스레드 안정성을 보장한다. - 에러 핸들링
모노와 플럭스는 데이터 처리 스트림 중에 발생하는 에러에 대한 처리 기능을 제공한다. 이를 사용하는 데는 비동기 처리에 대한 이해가 조금 더 필요하지만, 잘 다루게 된다면 섬세한 에러 핸들링이 가능하다. - Hot/Cold 스트림 지원
모노와 플럭스는 Hot/Cold 스트림을 모두 지원한다. 아래에 이어서 적겠지만 Hot 스트림이란 구독 전에 데이터가 발생하는 스트림이며 Cold 스트림은 구독이 발생할 때마다 데이터 스트림을 새로 생성하는 스트림을 가리킨다.
Hot Stream & Cold Stream
두 스트림은 리액티브 스트림에서 사용되는 일종의 데이터 스트림이라고 보면 된다.
그 차이는 대략 아래와 같다.
- Cold Stream
구독이 발생할 때마다 데이터 스트림을 처음부터 새로 생성. 때문에 데이터 전달 속도를 조절할 수 있으며 구독자간 독립적인 데이터 스트림을 보장한다. - Hot Stream
생산자가 독립적으로 데이터 스트림 생성. 끊임없이 데이터를 생성하며 구독자가 스트림에 접속하면 그 부분부터 데이터를 받게 된다. 구독자 없이도 데이터를 발행하기 때문에 구독자 별로 받는 데이터가 다를 가능성이 있다. Hot Stream은 유튜브 스트리밍과 같은 이벤트 스트림에 사용되며, 빠른 처리와 동시성에 강점이 있다.
Difference
- 데이터의 개수
모노는 0, 1개의 데이터를 다루며 Flux는 0개 이상의 데이터를 다룬다. - 완료 처리
모노는 단일요소를 다루므로 처리 후 즉시 완료된다.
하지만 플럭스는 여러 요소를 다룰 수 있기 때문에, 모든 요소를 처리한 후에 완료된다. - 에러 핸들링
단일 요소를 다루는 모노는 에러가 발생하면 해당 에러를 처리하기 위한 메서드가 호출되고 종료된다.
플럭스 역시 메서드 호출 후 종료되지만 에러 발생 이후에도 데이터를 발행할 수 있다. 이 경우 에러는 스트림 안에 포함되며, 이를 통해 스트림과 에러를 한 번에 처리할 수 있다.
'Java+Spring > WebFlux' 카테고리의 다른 글
[WebFlux]RSocket 튜토리얼 (1) | 2023.04.03 |
---|---|
[WebFlux]Reactive MongoDB - Criteria (2) | 2023.04.03 |
[WebFlux]자주 사용하는 연산자 정리(1) (2) | 2023.03.29 |
[WebFlux]리액티브 스트림(Reactive Streams) (2) | 2023.03.25 |
[WebFlux]이벤트 루프, Netty, 그리고 (2) | 2023.03.25 |
[WebFlux]Reactive Manifesto (1) | 2023.03.20 |
- Total
- Today
- Yesterday
- 남미
- java
- Algorithm
- 스트림
- 중남미
- spring
- 지지
- 맛집
- 세계여행
- 칼이사
- RX100M5
- 스프링
- 기술면접
- 유럽여행
- 면접 준비
- 리스트
- 자바
- 알고리즘
- 파이썬
- 세모
- Python
- 유럽
- Backjoon
- 백준
- 동적계획법
- 야경
- 세계일주
- 여행
- BOJ
- a6000
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |