원본 글: https://www.baeldung.com/java-reactor-flux-vs-mono
이 글은 Flux와 Mono의 차이점을 간단히 설명합니다.
1. What Is Mono?
Mono는 Publisher라는 특별한 타입의 클래스입니다. Mono오브젝트는 0~1개의 값을 가지며 onNext() 함수를 통하여 최대 1개의 값을 내보내고 onComplete() 함수를 통하여 요청이 끝났음을 알릴 수 있습니다. 그리고 실패했을 경우 onError() 함수를 발생시켜서 에러핸들링을 할 수 있게합니다.
@Test
public void givenMonoPublisher_whenSubscribeThenReturnSingleValue() {
Mono<String> helloMono = Mono.just("hello");
StepVerifier.create(helloMono)
.expectNext("hello")
.expectComplete()
.verify();
}
- create(): helloMono 객체를 구독합니다.
- expectNext("hello"): 해당 객체의 첫번째 값이 "hello"라고 기대합니다.
- expectComplete(): Mono가 정상적으로 완료되었음을 기대합니다. 참고로 Mono는 값을 방출한 뒤, 자동으로 onComplete()함수를 동작시킵니다.
- verify(): 위 테스트를 실행하고 예상값이 맞는지 판단합니다.
2. What Is Flux?
Flux는 표준 Publisher로서, 0개에서 N개까지의 비동기 시퀀스 값을 나타냅니다. 즉, onNext() 요청에 대해 0개에서 여러 개의 값을 방출할 수 있으며, 경우에 따라 무한히 많은 값을 방출할 수도 있습니다.
그리고 마지막에는 완료(onComplete()) 신호 또는 오류(onError()) 신호로 종료됩니다.
@Test
public void givenFluxPublisher_whenSubscribedThenReturnMultipleValues() {
Flux<String> stringFlux = Flux.just("hello", "minseok");
StepVerifier.create(stringFlux)
.expectNext("hello")
.expectNext("minseok")
.expectComplete()
.verify();
}
에러는 어떻게 지정하는지도 확인해봅니다.
@Test
public void givenFluxPublisher_whenSubscribeThenReturnMultipleValuesWithError() {
Flux<String> stringFlux = Flux.just("hello", "minseok", "Error")
.map(str -> {
if (str.equals("Error"))
throw new RuntimeException("Throwing Error");
return str;
});
StepVerifier.create(stringFlux)
.expectNext("hello")
.expectNext("minseok")
.expectError()
.verify();
}
원본글에는 제대로 설명되지 않은 중요 개념이 있는데 코드 속의 예외 발생은 구독할때 발생됩니다. 즉, StepVerifier의 코드를 지워도 해당 테스트는 통과합니다. stringFlux가 구독된 대상이 하나도 없기 때문에 실행되지 않았기 때문입니다.
3. Mono vs Flux
Mono와 Flux는 둘 다 Publisher 인터페이스의 구현체입니다.
쉽게 말해, 어떤 연산을 수행하거나 데이터베이스 또는 외부 서비스에 요청을 보낼 때, 결과가 최대 1개일 것으로 예상된다면 Mono를 사용해야 합니다.
반면에, 여러 개의 결과를 기대하는 경우에는 Flux를 사용해야 합니다.
Mono는 Java의 Optional 클래스와 유사하며, 0개 또는 1개의 값을 포함할 수 있습니다.
Flux는 Java의 List와 유사하며, N개의 값을 가질 수 있습니다.
4. 결론
Mono와 Flux를 비교한 글입니다.
개인적으로 이 글 자체는 너무나도 아쉽습니다.
너무 간단한 개념들이긴하지만 테스트방법에 대한 설명도 없고 그저 Mono는 0~1개 데이터를 나타낼때, Flux는 N개의 데이터를 나타날때 사용된다라는 내용만 있어서 그런것 같습니다.
이 구현체들이 실제 어떻게 동작하는지 더 자세히 설명해줬으면하는 아쉬움이 남는 가이드 글이였습니다.
'Baeldung번역&공부 > Spring-Reactive' 카테고리의 다른 글
Spring WebClient (0) | 2025.03.01 |
---|---|
WebFlux-Retry(Guide to Retry in Spring WebFlux) (0) | 2025.02.28 |
SpringMVC Async와 SpringWebFlux차이(Spring MVC Async vs Spring WebFlux) (0) | 2025.02.26 |
WbFlux에서 404Status를 반환하는방법(How to Return 404 with Spring WebFlux) (0) | 2025.02.25 |
Webflux에서 Error를 다루는방법(Handling Errors in Spring WebFlux) (0) | 2025.02.24 |