728x90
Publisher
- 생산자
- 데이터를 생산
- 생산된 데이터를 소비할 소비자(Subscriber)가 등록(subscribe)될 때까지 아무일도 일어나지 않는다. (매우중요)
Operator
- 체인 연산자
- 연산자(Operator)는 새로운 생산자(Publisher)를 반환한다
Subscriber
- 소비자
- 데이터를 소비
- 데이터 가지고 무엇을 할 건지 결정
예제
Flux<Integer> flux = Flux.range(1, 10);
flux.subscribe(number -> System.out.println(number));
예제를 설명하기 앞서 먼저 용어를 정리하면 다음과 같다.
- Publisher =
Flux
= 생산자 = 데이터를 생산 - Operator =
range
= 연산자 = Publisher를 반환 - Subscriber =
System.out.println
= 소비자 = 데이터를 소비
- 위의 예제에서는 생산자는
Flux
클래스이다. - 생산자(Flux)는 연산자(range)를 통해
[1..10 ]
이라는 데이터를 가진 생산자(flux)를 반환한다 - 생산자(flux)는 소비자(System.out.println)를 subscribe로 등록을 하여 데이터를 소비시킨다.
예제2
Flux<String> flux = Flux.just("A");
flux.map(s -> "foo" + s);
flux.subscribe(System.out::println);
위의 코드의 결과값은 어떻게 될까?
Flux가 just라는 연산자로 A
라는 문자타입 값을 가진 flux를 생성한다.
해당 flux를 다시 map이라는 연산자로 foo
라는 문자를 더한다.
마지막으로 System.out::println이라는 Subscriber를 subscribe하므로 A
라는 값이 반환될 것이라 예상할 수 있다.
하지만 결과를 보면 A를 리턴하게 된다.
사실 두번째 줄의 flux.map(s -> "foo" + s)
는 map
이라는 연산자를 사용했다는 점을 주목하자.
연산자는 항상 연산된 Flux를 반환한다.
우리가 원하는 결과를 반환하려면 위의 코드는 실제로 아래와 같아야 한다.
Flux<String> flux = Flux.just("A");
Flux<String> flux2 = flux.map(s -> "foo" + s);
flux2.subscribe(System.out::println);
map 연산자를 사용하여 flux2라는 Flux를 반환하였다.
연산자를 통해 A
라는 문자에 foo
라는 문자가 추가된 데이터를 가진 Flux를 반환된다.
반환된 Flux가 fooA
라는 데이터를 가질 테니 subscribe를 통해 해당 데이터를 소비할 수 있게된다.
그러면 아래처럼 원하는 결과를 반환할 수 있다.
출처
728x90