[JAVA] Mono와 Flux에 대해서 알아보자
회사에서 RxJava에 대한 부분이 필요해서 공부를 시작해보았따... 쀼 진즉할껄
Reactive Streams의 핵심 개념!
- 비동기 (Asynchronous)
- 데이터가 도착할 때까지 기다리지 않고 콜백 등으로 처리하는 방식.
- 스트림 (Stream)
- 한 번에 모든 데이터를 처리하지 않고 데이터를 조금씩 흐르게 하면서 처리하는 방식.
- 논블로킹(Non-blocking)
- 처리 중인 작업이 끝날 때까지 스레드를 붙잡지 않음. CPU 낭비가 적다.
- 백프레셔(Backpressure)
- subscriber가 너무 많은 데이터를 한 번에 못 받을 경우 publisher에게 "천천히 좀 보내~!!" 하고 알려주는 흐름 제어 메커니즘.
자바에서 Reactive Streams 인터페이스 구성
인터페이스 | 설명 |
Publisher<T> | 데이터를 발생(emit)하는 쪽 |
Subscriber<T> | 데이터를 구독하고 처리하는 쪽 |
Subscription | 구독 상태를 관리하고 백프레셔를 제아함 |
Processor<T, R> | Publisher이자 Subscriber. 중간 처리 역할(옵션) |
Mono와 Flux..?
- Publisher 인터페이스를 구현해서 Reactive Streams 사양을 따르는 비동기 스트림 처리 유틸리티다.
타입 | 의미 | 예시 |
Mono<T> | 0 또는 1개의 데이터를 비동기적으로 처리 | 로그인 결과, DB에서 사용자 한 명 조회 |
Flux<T> | 0개 이상(무한가능)의 데이터를 비동기적으로 처리 | 알림 스트림, 채팅 메시지 스트림, 목록 조회 등 |
Mono와 Flux의 구체적인 특징은!?
- 지연 실행(Lazy): 선언만 해두고, 구독(subscribe()) 해야 실행된다.
- 비동기 처리: 데이터가 준비되면 비동기로 onNext, onComplete를 호출한다.
- 체이닝 연산: map, flatMap, filter, delayElements, concat, zip 등 다양한 연산자를 제공 한다.
예제
Mono: 사용자 하나 조회
Mono<String> mono = Mono.just("Hello, Mono!");
mono.subscribe(System.out::println); // → Hello, Mono!
Flux: 리스트 스트림
Flux<String> flux = Flux.just("A", "B", "C");
flux.subscribe(System.out::println);
// → A
// → B
// → C
내부 동작은? (리액티브 스트림 패턴)
- Mono나 Flux는 Publisher 역할을 하고 subscribe()를 호출하면 내부에서 아래 흐름이 작동 된다.
Publisher (Mono/Flux)
→ Subscription 생성
→ Subscriber에게 전달
→ request(n) 요청 수만큼 데이터 전달
Mono 내부 흐름
Mono.just("Hi")
.map(data -> data + " Lima") // 데이터 변환
.subscribe(
System.out::println, // onNext
error -> {}, // onError
() -> System.out.println("완료") // onComplete
);
실전 적용 예 - WebFlux Controller
@GetMapping("/user/{id}")
public Mono<User> getUser(@PathVariable String id) {
return userService.findById(id); // Mono<User>
}
@GetMapping("/users")
public Flux<User> getUsers() {
return userService.findAll(); // Flux<User>
}
정리
- Mono와 Flux는 Reactive Streams를 구현한 비동기 스트림 클래스로 Mono는 0 - 1개 Flux는 0 - N개의 데이터를 비동기 + 논블로킹 + 백프레셔 기반으로 처리한다!
** 그냥 하루하루 개인 공부한 것을 끄적 거리는 공간입니다.
이곳 저곳에서 구글링한 것과 강의 들은 내용이 정리가 되었습니다.
그림들은 그림밑에 출처표시를 해놓았습니다.
문제가 될시 말씀해주시면 해당 부분은 삭제 하도록하겠습니다. **
참고 문헌
https://medium.com/@cheron.antoine/reactor-java-1-how-to-create-mono-and-flux-471c505fa158
[Reactor Java #1] How to create Mono and Flux ?
Reactor is a Java library for creating reactive non-blocking applications on the JVM based on the Reactive Streams Specification.
medium.com
https://www.javaguides.net/2023/04/reactive-programming-in-java.html