ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • webflux if else를 사용해보자 with switchIfEmpty
    spring 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

     

    반응형

    댓글

Designed by Tistory.