[Spring WebFlux] Project Reactor

끝으로 ㅣ 2025. 2. 15. 12:53

1. Project Reactor란?

- 프로젝트 리액터는 JVM 환경에서 리액티브 애플리케이션을 개발할 수 있도록 지원하는 오픈 소스 프레임워크이다
- Spring WebFlux에서 사용하는 Reactive Streams의 구현체

 

2. Mono & Flux

- 리액터에서 핵심이 되는 두 가지 타입
- Lazy(지연 실행) 방식으로 동작해서 subscribe()를 호출하기 전까지 연산자가 실행되지 않는다

타입 설명
Mono 0~1개의 단일 요소를 통지하는 발행자
Flux 0~N개의 요소를 통지하는 발행자

- 둘 다 리액티브 스트림 사양의 발행자(Publisher)를 구현하고 있어서 onError, onComplete 시그널이 발생할 때까지 onNext를 통해 데이터를 구독자(Subscriber)에게 전달한다

- 데이터 가공, 필터링, 에러 핸들링 등 다양한 연산자(operator)를 제공

 

3. Mono

- Mono는 단일 요소(또는 없는 경우)를 처리하는 리액티브 타입

  • just(T data) → 단일 데이터를 Mono로 감싸는 가장 간단한 방법
  • map(Function<T, R> mapper) → 데이터를 변환할 때 사용
  • flatMap(Function<T, Mono<R>> mapper) → 단일 데이터를 여러 개로 변환
  • filter(Predicate<T> predicate) → 특정 조건에 맞는 데이터만 필터링
  • zip(Mono<T>, Mono<U>) → 여러 개의 Mono를 결합하여 하나의 Mono로 변환
  • block() → 기본적으로 subscribe()를 호출해야 실행되지만, block()을 사용하면 즉시 구독하고 결과를 가져옴

 

4. Flux

- Flux는 여러 개의 데이터를 처리하는 리액티브 타입

  • publishOn(Scheduler scheduler) → 데이터를 처리할 스레드(Scheduler)를 지정하는 연산자

 

5. Schedulers 종류

스케줄러 설명
Schedulers.immediate() 쓰레드를 변경하고 싶지 않을 때 사용 (null 객체처럼 활용)
Schedulers.single() 하나의 ExecutorService에서 실행 (일회성 태스크에 적합)
Schedulers.parallel() CPU를 많이 사용하는 짧은 태스크에 적합 (CPU 개수만큼 병렬 실행)
Schedulers.elastic() 블로킹 I/O 태스크처럼 오래 걸리는 작업에 적합 (스레드 제한 없음)
Schedulers.boundedElastic() elastic과 유사하지만, 스레드 개수가 제한됨

 

6. Hot vs Cold

Cold 발행자 vs Hot 발행자

  • Cold 발행자 → 각 구독자(subscriber)가 새로운 데이터를 받음 (ex. HTTP 응답)
  • Hot 발행자 → 구독자의 상태와 상관없이 계속 데이터를 발행함 (ex. WebSocket, 메시지 브로커)

 

Cold Sequence vs Hot Sequence

유형 설명
Cold Sequence subscribe() 할 때마다 새로운 데이터를 생성 (Lazy 방식)
Hot Sequence subscribe()와 관계없이 즉시 데이터 발행 (미리 생성된 데이터를 사용)
  • Cold Sequence는 구독이 발생해야 동작
  • Hot Sequence는 구독 여부와 관계없이 데이터를 계속 발행