본문 바로가기
2023~/스프링으로 시작하는 리액티브 프로그래밍

Ch06 마블 다이어그램

by 경아ㅏ 2024. 9. 19.

 

6.1 마블 다이어그램이란?

마블(구슬) + 다이어그램(도표)
Publisher 의 데이터 생성 + Operator 데이터 가공 + 데이터 출력 과정을 도표로 나타낸 것

 

  • Publisher 가 데이터를 emit 하는 타임라인
  • OnComplete signal: 정상적으로 데이터가 emit 되었을 때 Publisher 가 보내는 signal
  • emit 된 데이터에 Operator 함수를 적용하여 데이터 가공
  • Operator 를 거쳐 변환된 데이터 타임라인
  • onComplete signal: 데이터 처리 종료 후 Publisher 가 보내는 signal
  • onError signal: 데이터 가공시 에러가 발생하면 Publisher 가 보내는 signal

 

 

6.2 마블 다이어그램으로 Reactor 의 Publisher 이해하기

1) Mono

0개 혹은 1개의 데이터를 emit 하는 Publisher

(RxJava 에서는 1개의 데이터를 emit 하는 Single, 0개 또는 1개의 데이터를 emit 하는 Maybe Publisher 를 구분하지만 Reactor 에서는 통일)

public class MonoExample {
    public static void main(String[] args) {
        
        // 데이터 1개 emit
        Mono
            .just("Hello Reactor")
            .subscribe(System.out::println);
      
        // 데이터 0개 emit
        // 데이터가 없으므로 바로 onComplete signal
        // 데이터를 전달 받을 필요는 없지만 특정 작업이 완료되었음을 알리고 싶을때 onComplete signal 만 보내도록 함
        Mono
            .empty()
            .subscribe(
                    none -> System.out.println("# emitted onNext signal"), // onNext signal
                    error -> {}, // onError signal (Exception 을 받아서 처리)
                    () -> System.out.println("# emitted onComplete signal") // onComplete signal
            );
    }
}

 

 

2) Flux

0개 ~ N개의 데이터를 emit 하는 Publisher

public class ExampleFlux {
    public static void main(String[] args) {
            
            // just
            Flux.just(6, 9, 13)
                .map(num -> num % 2)
                .subscribe(System.out::println);

            // fromArray
            // 배열로 부터 Flux 객체 생성
            Flux.fromArray(new Integer[]{3, 6, 7, 9})
                .filter(num -> num > 6)
                .map(num -> num * 2)
                .subscribe(System.out::println);
                
            // concatWith
            // upstream 에서 emit 된 데이터와 인자로 주어진 emit 데이터를 합쳐서 emit
            Mono.justOrEmpty("Steve")
                .concatWith(Mono.justOrEmpty("Jobs"))
                .subscribe(System.out::println);
            
            // collectList()
            // emit 된 데이터를 하나로 모아 리스트로 만들어 emit
            // emit 결과는 Mono(리스트 하나이므로)
            Flux.concat(
                        Flux.just("Mercury", "Venus", "Earth"),
                        Flux.just("Mars", "Jupiter", "Saturn"),
                        Flux.just("Uranus", "Neptune", "Pluto"))
                .collectList()
                .subscribe(planets -> System.out.println(planets));
    }
}

 

 

 

댓글