-
webflux if else를 사용해보자 with switchIfEmptyspring 2021. 8. 3. 16:58반응형
webflux에서 if else를 사용하기 위한 기초를 다루고 어떻게 응용할 수 있는지 알아보자
바로 예제를 살펴보도록 하자
Flux로 테스트를 했지만 Mono로 테스트하여도 switchIfEmpty를 사용하는 방법은 같다
Flux.just(1, 2, 3) .flatMap(c -> { System.out.println("flatmap1 :" + c + ", return Flux.emptu()"); return Flux.<String>empty(); }) .switchIfEmpty(Flux.defer(() -> { System.out.println("switchIfEmpty1"); return Flux.empty(); })).flatMap(b -> { System.out.println("flatmap2"); return Flux.<String>empty(); }).switchIfEmpty(Flux.defer(() -> { System.out.println("switchIfEmpty2"); return Flux.just("S"); })).subscribe((d) -> { System.out.println("subscribe : " + d); }); 출력 flatmap1 :1, return Flux.empty() flatmap1 :2, return Flux.empty() flatmap1 :3, return Flux.empty() switchIfEmpty1 Flux.empty() switchIfEmpty2 Flux.just("S") subscribe : S
flatmap1에서 1, 2, 3 반복에 대한 empty를 반환하게 되면 그다음 switchIfEmpty가 반환된다 그리고 또 empty를 반환되면 flatmap2을 건너뛰고 그 다음 switchIfEmpty를 실행하게 된다 출력 때문에 이해하기 쉬울 것이다
그럼 1, 2, 3 반복 중에 하나라도 empty()를 반환하지 않는다면 어떻게 될까?
Flux.just(1, 2, 3) .flatMap(c -> { System.out.println("flatmap1 :" + c + ", return Flux.empty()"); if (c == 2) { return Flux.just(c); } return Flux.empty(); }) .switchIfEmpty(Flux.defer(() -> { System.out.println("switchIfEmpty1"); return Flux.empty(); })).flatMap(b -> { System.out.println("flatmap2"); return Flux.<String>empty(); }).switchIfEmpty(Flux.defer(() -> { System.out.println("switchIfEmpty2"); return Flux.just("S"); })).subscribe((d) -> { System.out.println("subscribe : " + d); }); flatmap1 :1, return Flux.empty() flatmap2 return Flux.<String>empty() flatmap1 :3, return Flux.empty() switchIfEmpty2 return Flux.just("S") subscribe : S
바로 아래 있는 switchIfEmpty1은 실행되지 않는다
switchIfEmpty에 Flux.differ가 들어가 있는지는 아래 링크를 참조하길 바란다.
https://coding-start.tistory.com/372
그럼 어떻게 응용할 수 있을까? 뭐 다양하게 있지만 나 같은 경우에는 실무에서 캐시에 데이터가 있는지 확인하고 없으면 db나 api를 찌르는 방식으로 사용한다 그 외에도 다양한 케이스가 있을 것이고 이것은 하나의 예이다
public Mono getGoodsList() { return cache.getCache() 캐시를 가져온다 .flatMap(data -> Mono.just(data)) 캐시에서 가져온 데이터를 가공한다 .switchIfEmpty(Mono.defer(() -> db.call() or api.call())) cache.getCache()에서 empty를 반환했다면 () -> db.call() or api.call()를 실행 }
아래는 그냥 만든 예제인데 궁금하면 한번 보시길!
Flux.just(1, 2, 3) .flatMap(c -> { System.out.println("flatmap1 :" + c + ", return Flux.emptu()"); return Flux.<String>empty(); }) .switchIfEmpty(Flux.defer(() -> { System.out.println("switchIfEmpty1"); return Flux.just("s"); })).flatMap(b -> { System.out.println("flatmap2"); return Flux.<String>empty(); }).switchIfEmpty(Flux.defer(() -> { System.out.println("switchIfEmpty2"); return Flux.just("S"); })).subscribe((d) -> { System.out.println("subscribe : " + d); }); flatmap1 :1, return Flux.empty() flatmap1 :2, return Flux.empty() flatmap1 :3, return Flux.empty() switchIfEmpty1 return Flux.just("s") flatmap2 return return Flux.<String>empty() switchIfEmpty2 return Flux.<String>empty() subscribe : S Flux.just(1, 2, 3) .flatMap(c -> { System.out.println("flatmap1 :" + c + ", Flux.just(c);"); return Flux.just(c); }) .switchIfEmpty(Flux.defer(() -> { System.out.println("switchIfEmpty1"); return Flux.empty(); })).flatMap(b -> { System.out.println("flatmap2"); return Flux.<String>empty(); }).switchIfEmpty(Flux.defer(() -> { System.out.println("switchIfEmpty2"); return Flux.just("S"); })).subscribe((d) -> { System.out.println("subscribe : " + d); }); flatmap1 :1, return Flux.just(c) flatmap2 return Flux.<String>empty() flatmap1 :2, Flux.just(c) flatmap2 return Flux.<String>empty() flatmap1 :3, Flux.just(c) flatmap2 return Flux.<String>empty() switchIfEmpty2 Flux.just("S") subscribe : S
반응형'spring' 카테고리의 다른 글
LocalDate, LocalDateTime format 변경 (0) 2021.05.04 spring batch reader에서 transaction read mode로 실행하기 (1) 2020.05.21 lombok build -> rebuild error (0) 2020.05.13 gradle build error 날 경우 (0) 2020.05.13 Spring EntityManagerFactoryBuilder 에러 (0) 2020.05.02