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는 구독 여부와 관계없이 데이터를 계속 발행
'Spring WebFlux' 카테고리의 다른 글
[Spring WebFlux] Reactive Streams (0) | 2025.02.26 |
---|---|
[Spring WebFlux] Reactive Programming과 Design Pattern (0) | 2025.02.25 |
[Spring WebFlux] Blocking vs Non-Blocking & Sync vs Async (0) | 2025.02.15 |