Reactor (=Project Reactor)
- Reactive Streams 표준 사양을 구현한 구현체 중 하나
- Reactive한 애플리케이션으로 동작하는 데 핵심적인 역할을 담당하는 라이브러리
Reactor 특징
- Non-Blocking 통신 지원
- Publisher 타입으로 Mono[0|1], Flux[N] 두 가지 타입을 제공
- MSA(Microservice Architecture)에 적합
- Backpressure
- https://projectreactor.io/docs/core/release/reference/#reactive.backpressure
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
Ref - https://projectreactor.io/docs/core/release/api/
## '|'는 정상 종료, 'X'는 에러로 인한 비정상 종료를 의미한다.
Ref - https://projectreactor.io/docs/core/release/api/
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 |