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 객체로 반환합니다.

 

Mono flatMapMany

 

Flux&nbsp;fromIterable

 

Flux merge

 

Flux collectList

 

728x90
반응형