728x90
1. Reactor?
리액티브 스트림즈 표준 사양을 구현한 구현체 중 하나이다.
리액티브 스택에 포함되어 리액티브한 애플리케이션으로 동작하는데 있어 핵심적인 역할을 담당하는 리액티브 프로그래밍을 위한 라이브러리.
2. Reactor의 특징
- 리액티브 스트림즈(Reactive Streams)를 구현한 리액티브 라이브러리이다.
- Non-Blocking 통신을 지원한다.
※ Non-Blockong : 리액티브 프로그래밍의 핵심적인 특징, 요청 쓰레드가 차단이 되지 않는다. - Publisher 타입으로 Mono[0|1], Flux[N] 이 두가지 타입을 제공한다.
※ Mono[0|1] : 0건 또는 1건의 데이터를 emit 할 수 있다.
※ Flux[N] : 여러 건의 데이터를 emit 할 수 있다. - 서비스들 간의 통신이 잦은 MSA(MicroService Architecture) 기반 애플리케이션들은 요청 쓰레드가 차단되는 Blocking 통신을 사용하기에 무리가 있다. 그래서 기본적으로 Non-Blocking 통신을 완벽하게 지원하는 Reactor는 MSA구조에 적합한 라이브러리이다.
- 처리되지 않고 대기하는 데이터가 지속적으로 쌓이면 오버플로우가 생겨 시스템이 다운될 수 있는데 이를 BackPressure를 통해 제어할 수 있다.
3. 마블 다이어그램(Marble Diagram)
- 마블다이어그램으로 Mono와 Flux이해
- Mono의 마블 다이어그램(0건, 1건의 데이터를 처리하기에 구슬이 한개이다.)
- Flux의 마블 다이어그램(다량의 데이터를 처리하기에 구슬이 여러개이다.)
4. 스케줄러(Scheduler)
쓰레드를 관리하는 관리자의 역할을 하고, Reactor Sequence상에서 처리되는 동작들을 하나 이상의 쓰레드에서 동작하도록 별도의 쓰레드를 제공해준다.
쓰레드가 직접 복잡한 계산을 수행할 경우 응답 처리 시간이 늦어지기 때문에 스케줄러를 통해 별도의 쓰레드를 생성한 후, 복잡한 계산을 수행하도록 한다.
5. Operators
Reactor에서 가장 중요한 구성요소이다.
- 실제 많이 사용되는 Operator 목록
- 새로운 Sequence를 생성 할 때
- just()
- fromStream() : Java의 Stream을 입력으로 전달 받아 emit한다.
- fromIterable() : Jave의 Iterable을 입력으로 전달 받아 emit한다.
- fromArray()
- range()
- interval()
- empty()
- never()
- defer()
- using()
- generate()
- create() : Signal 이벤트를 발생시키는Operator, 한 번에 여러 건의 데이터를 비기동적으로 emit한다.
- 기존 Sequence에서 변환 작업을 할 때
- map()
- flatMap() : 하나의 데이터가 들어올 때 마다 새로운 Sequence가 생성된다. 작업의 처리 순서를 보장하지 않는다.
- concat() : Sequence에서 시간 순서대로 데이터를 차례대로 emit한다.
- collectList()
- collectMap()
- merge()
- zip() : 입력으로 전달되는 여러 개의 Publisher Sequence에서 emit된 데이터를 결합한다.
- then()
- switchIfEmpty()
- and()
- when()
- Sequence 내부의 동작을 확인 할 때
- doOnSubscribe()
- doOnNext() : emit시 부수효과를 추가할 수 있다.
- doOnError()
- doOnCancel()
- doFirst()
- doOnRequest()
- doOnTerminate()
- doAfterTerminate()
- doOnEach()
- doFinally()
- log() : Publisher에서 발생하는 Signal 이벤트를 로그로 출력해준다.
- Sequence에서 데이서 필터링을 할 때
- filter()
- ignoreElements()
- distinct()
- take()
- next()
- skip()
- sample()
- single()
- 에러 처리를 할 때
- error() : 의도적으로 onError Signal을 발생시킬 때 사용할 수 있다.
- timeout() : 입력으로 주어진 시간동안 emit되는 데이터가 없으면 onError Signal 이벤트를 발생시킨다.
- onErrorReturn()
- onErrorResume()
- onErrorMap()
- doFinally()
- retry() : Sequence 상에서 에러가 발생할 경우, 입력으로 주어진 숫자만큼 재구독해서 Sequence를 다시 시작한다.
- 새로운 Sequence를 생성 할 때
'JAVA > Spring' 카테고리의 다른 글
[Spring] Spring Batch(1) (0) | 2023.04.26 |
---|---|
[Spring] Spring Boot 3.0 (0) | 2023.03.26 |
[Spring] Java Spring? (0) | 2023.03.23 |
[Spring Web Flux] Reactive programming (0) | 2022.11.30 |
[SPRING]Spring Framework (0) | 2022.11.30 |