Flux는 0개 ~ N개의 데이터를 비동기 시퀀스로 표현하고 Mono는 0개 ~ 1개의 데이터를 비동기 시퀀스로 표현합니다. 즉, Flux는 스트림을 표현하는 타입이고 Mono는 단일 결과(혹은 없는 결과)를 표현하는 타입입니다.
그런데 Flux가 0개 ~ N개를 표현한다면 Flux의 데이터 표현 범위는 Mono의 범위를 포함하는데 왜 Flux와 Mono로 나눴을까요?
Mono가 필요한 이유
- 의도를 명확히 표현하기 위해
- 단 하나의 값만 emit하거나 완료되면 되는 작업(예: 단일 DB 조회)에 Flux를 쓰면 “N개일 수 있음”으로 해석되어 혼동을 줄 수 있습니다.
- Mono는 “단 하나의 결과(또는 없음)”만 나올 것을 타입으로 보장하여 의도를 분명히 표현 가능합니다.
- API 일관성 및 조합의 유연성
- Reactor 오퍼레이터는 Mono와 Flux 모두에 대해 제공되므로, Mono로 시작해도 이후 flatMap, map 등을 통해 Flux로 확장 가능
- WebFlux의 Controller 리턴 타입에서
Mono<ResponseEntity<>>
와 같이 단일 응답을 자연스럽게 표현 가능
- 불필요한 오버헤드 방지
- Flux는 기본적으로 Backpressure 등을 고려해 다수의 emit을 위한 구조를 사용하지만,
- Mono는 단일 데이터 emit을 위한 최적화된 경량 구조를 사용해 메모리 및 실행 오버헤드가 적습니다.
결론적으로, Mono를 통해 단일 값에 대한 의도를 명확하게 표현할 수 있고 Flux의 불필요한 오버헤드를 방지할 수 있습니다.