본문 바로가기
Programming/Spring

[리액티브 프로그래밍] Publisher와 Subscriber - 1

by peter paak 2021. 3. 17.
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 = 소비자 = 데이터를 소비
  1. 위의 예제에서는 생산자Flux클래스이다.
  2. 생산자(Flux)는 연산자(range)를 통해 [1..10 ]이라는 데이터를 가진 생산자(flux)를 반환한다
  3. 생산자(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를 반환된다.
반환된 FluxfooA라는 데이터를 가질 테니 subscribe를 통해 해당 데이터를 소비할 수 있게된다.
그러면 아래처럼 원하는 결과를 반환할 수 있다.

출처

728x90