본문 바로가기
Develop/Spring

Spring WebFlux - Reactor (Project Reactor)

by jaeyoungb 2022. 11. 30.

Reactor (=Project Reactor)

  • Reactive Streams 표준 사양을 구현한 구현체 중 하나
  • Reactive한 애플리케이션으로 동작하는 데 핵심적인 역할을 담당하는 라이브러리

- https://projectreactor.io/

 

Reactor 특징

 

Reactor 구성 요소

  • Reactor Sequence의 시작점 Flux
  • 데이터를 emit하는 Publisher의 역할 just()
  • Publisher로부터 전달받은 데이터를 가공하는 Operator map()
  • 쓰레드 관리자 역할을 하는 Scheduler를 지정하는 Operator publishOn()
  • subscribe(1, 2, 3)
    1 : Publisher가 emit한 데이터를 전달받아서 처리하는 역할
    2 : Reactor Sequence 상에서 에러가 발생할 경우, 헤당 에러를 전달받아서 처리하는 역할
    3 : Reactor Sequence가 종료된 후 후처리를 하는 역할 (Reactor Sequence가 정상 종료되면 동작)

 

마블 다이어그램(Marble Diagram)

  • Reactive Programming에서는 어떤 Operator를 사용하느냐에 따라 데이터의 흐름이 다양하게 변화할 수 있는데, 이 복잡한 데이터 흐름을 이 마블 다이어그램을 통해 좀 더 쉽게 이해할 수 있다.
  • 구슬 모양의 알록달록한 동그라미는 하나의 데이터를 의미하고, 시간의 흐름에 따라 변화하는 데이터의 흐름을 표현한다.

https://projectreactor.io/docs/core/release/reference/#howtoReadMarbles

 

Mono의 마블 다이어그램.

Ref - https://projectreactor.io/docs/core/release/api/

 

## '|'는 정상 종료, 'X'는 에러로 인한 비정상 종료를 의미한다.

 

Flux의 마블 다이어그램

Ref - https://projectreactor.io/docs/core/release/api/

 

map() Operator의 마블다이어그램

Ref - https://projectreactor.io/docs/core/release/api/

 

## 문서로 된 API 설명을 읽어도 이해되지 않는 부분은 마블 다이어그램을 보면 대부분 이해가 될 수 있다.

## 먼저 해당 Operator를 먼저 이해하면서 마블 다이어그램을 이해하고, 그래도 이해가 안가면 공식 API 문서 설명을 읽어보자.

 

 

스케쥴러(Scheduler)

- 쓰레드를 관리하는 관리자의 역할

- Reactor Sequence 상에서 처리되는 동작들을 하나 이상의 쓰레드에서 동작하도록 별도의 쓰레드를 제공해준다.

- https://projectreactor.io/docs/core/release/reference/#schedulers

 

- Scheduler에서 지원하는 쓰레드 유형
  https://spring.io/blog/2019/12/13/flight-of-the-flux-3-hopping-threads-and-schedulers

 

## Reactor의 Scheduler는 복잡한 멀티쓰레딩 프로세스를 단순하게 해준다.

 

스케쥴러 전용 Operator

적절한 상황에 맞는 쓰레드를 추가로 생성하는 Operator

  • 구독 직후에 실행되는 Operator 체인의 실행 쓰레드를 Schduler로 지정한 쓰레드로 변경 subscribeOn()
  • 구독 직후에 어떤 동작을 수행하고 싶다면 doOnSubscribe()에 로직을 작성
  • 주로 subscribeOn()에서는 Schedulers.boundedElastic()을 사용

## subscribeOn()은 주로 데이터 소스에서 데이터를 emit하는 원본 Publisher의 실행 쓰레드를 지정하는 역할을 한다.

## subscribeOn()은 여러 번 추가해도 하나의 쓰레드만 추가로 생성된다.

 

  • Downstream쪽 쓰레드가 publishOn()에서 Scheduler로 지정한 쓰레드로 변경
  • publishOn()에서는 주로 Schedulers.parallel()을 사용

## publishOn()은 전달받은 데이터를 가공 처리하는 Operator 앞에 추가해서 실행 쓰레드를 별도로 추가하는 역할을 한다.

## publishOn()은 Operator 앞에 여러 번 추가할 경우, 별도의 쓰레드가 추가로 생성된다.

 

 

Reactor의 여러 Operator에 대해

- https://projectreactor.io/docs/core/release/reference/#which-operator

- https://projectreactor.io/docs/core/release/api/

 

## Operator의 종류는 너무 많기 때문에, 상황별로 자주 사용되는 것들의 사용법을 익히고, 그때그때 상황에 맞게 필요한 Operator를 찾아 사용하는 것이 좋다.

 

'Develop > Spring' 카테고리의 다른 글

ddl-auto 옵션  (2) 2022.12.23
Spring WebFlux  (0) 2022.12.01
Spring Webflux - Reactive Programming  (0) 2022.11.29
OAuth 2 + JWT 샘플 애플리케이션 구현  (0) 2022.11.29
OAuth 2 샘플 애플리케이션 구현  (0) 2022.11.28