public void static main/Java

[JAVA] Mono와 Flux에 대해서 알아보자

햄리뮤 2025. 7. 1. 22:45
반응형

 

회사에서 RxJava에 대한 부분이 필요해서 공부를 시작해보았따... 쀼 진즉할껄

 


 

Reactive Streams의 핵심 개념!

  1. 비동기 (Asynchronous)
    • 데이터가 도착할 때까지 기다리지 않고 콜백 등으로 처리하는 방식.
  2. 스트림 (Stream)
    • 한 번에 모든 데이터를 처리하지 않고 데이터를 조금씩 흐르게 하면서 처리하는 방식.
  3. 논블로킹(Non-blocking)
    • 처리 중인 작업이 끝날 때까지 스레드를 붙잡지 않음. CPU 낭비가 적다.
  4. 백프레셔(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

 

 

반응형