spring/spring webFlux
[WebFlux] Mono에 담긴 List를 하나로 합치기
moonsiri
2023. 7. 13. 17:36
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
반응형