728x90
반응형
Spring WebClient를 통해 동일한 객체타입을 리턴하는 여러 외부 API를 호출하면서 Mono를 List로 담았는데, 각 API 호출 응답으로 받은 객체가 List여서 Flux.merge(monoList).collectList() 타입이 Mono<List<List<Object>>>이 돼버렸습니다.
Mono<List<List<Object>>>가 아닌 Mono<List<Object>>로 리턴할 수 있는 방법을 알아보겠습니다.
우선 아래 코드를 비교해 확인해 주세요.
// AS-IS
public Mono<List<Object>> getList(...) {
List<Mono<List<Object>>> monoList = new ArrayList<>();
Mono<List<Object>> listMono1 = Mono.just(List.of(...));
monoList.add(listMono1);
Mono<List<Object>> listMono2 = Mono.just(List.of(...));
monoList.add(listMono2);
return Flux.merge(monoList).collectList()
.map(res -> res.stream().flatMap(List::stream).collect(Collectors.toList()));
}
// TO-BE
public Mono<List<Object>> getList(...) {
List<Flux<Object>> fluxList = new ArrayList<>();
Mono<List<Object>> listMono1 = Mono.just(List.of(...));
fluxList.add(listMono1.flatMapMany(Flux::fromIterable));
Mono<List<Object>> listMono2 = Mono.just(List.of(...));
fluxList.add(listMono2.flatMapMany(Flux::fromIterable));
return Flux.merge(fluxList).collectList();
}
두 번째 코드를 확인해 보면, Mono의 flatMapMany()와 Flux의 fromIterable()을 사용하여 Mono 객체를 Flux 객체로 변환하였습니다.
정확히는 Flux의 fromIterable()에서 Iterable 객체를 풀어서 Flux 형태로 변환하고, Mono의 flatMapMany()는 이 결과로 나온 Flux 객체를 반환하는 것입니다.
이렇게 반환된 Flux 객체들을 Flux.merge()로 합친 후에 collectList()를 사용하면 하나의 Mono 객체로 반환합니다.
728x90
반응형
'spring > spring webFlux' 카테고리의 다른 글
[Spring] WebMVC에서 WebFlux 사용 (with WebClient) (0) | 2023.07.13 |
---|---|
[webFlux] SwitchIfEmpty가 항상 호출되는 이슈 해결 (Lazy Evaluation) (0) | 2022.12.20 |
[SpringBoot] Reactive RESTful Web Service 구축 실습 (0) | 2021.02.18 |
[Spring] Reactive Programming (1) - Reactor 3, WebFlux (0) | 2021.02.18 |
댓글