๐ ์ค๋ ๋ฐฐ์ด ๋ด์ฉ!
- Reactor (Project Reactor)
- ๋ง๋ธ ๋ค์ด์ด๊ทธ๋จ (Marble Diagram)
- ์ค์ผ์ค๋ฌ (Scheduler)
- Operators
โ๏ธ Reactor (Project Reactor)
- ๋ฆฌ์กํฐ๋ธ ์คํธ๋ฆผ์ฆ ํ์ค ์ฌ์์ ๊ตฌํํ ๊ตฌํ์ฒด ์ค ํ๋
- ๋ฆฌ์กํฐ๋ธํ ์ ํ๋ฆฌ์ผ์ด์ ์ผ๋ก ๋์ํ๋๋ฐ ์์ด ํต์ฌ์ ์ธ ์ญํ ์ ๋ด๋นํ๋ ๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ์ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
โ Reactor ํน์ง
- Non-Blocking ํต์
โ ์ฐ๋ ๋๊ฐ ์ฐจ๋จ๋์ง ์์ - MSA(Microservice Architecture) ๊ตฌ์กฐ์ ์ ํฉํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
( MSA ๊ธฐ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ๋ค์ ์์ฒญ ์ฐ๋ ๋๊ฐ ์ฐจ๋จ๋๋ Blocking ํต์ ์ ์ฌ์ฉํ๊ธฐ์๋ ๋ฌด๋ฆฌ๊ฐ ์๊ธฐ ๋๋ฌธ์ Non-Blocking ํต์ ์ ์๋ฒฝํ ์ง์ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ฌ์ผ ํ๊ธฐ ๋๋ฌธ ) - Operator๋ก ์์ํด์ Operator๋ก ๋๋๋ค !
- Mono[0|1]์ Flux[N]์ด๋ผ๋ ๋ ๊ฐ์ง Publisher ํ์
์ ๊ณต
- Mono[0|1]์์ 0๊ณผ 1
โ 0๊ฑด or 1๊ฑด์ ๋ฐ์ดํฐ๋ฅผ emit ํ ์ ์์์ ์๋ฏธ - Flux[N]์์ N
โ ์ฌ๋ฌ ๊ฑด์ ๋ฐ์ดํฐ๋ฅผ emitํ ์ ์์์ ์๋ฏธ
- Mono[0|1]์์ 0๊ณผ 1
- Backpressure ์ ๋ต
- Subscriber์ ์ฒ๋ฆฌ ์๋๊ฐ Publihser์ emit ์๋๋ฅผ ๋ฐ๋ผ๊ฐ์ง ๋ชปํ ๋ ์ ์ ํ๊ฒ ์ ์ดํ๋ ์ ๋ต
- DROP ์ ๋ต
โ ๋ฒํผ๊ฐ ๊ฐ๋ ์ฐจ๋ฉด, ์ดํ์ ๋ค์ด์ค๋ ๋ฐ์ดํฐ๋ DROPํ๋ ์ ๋ต - LATEST ์ ๋ต
โ ๋ฒํผ๊ฐ ๊ฐ๋ ์ฐจ๋ฉด, ๊ฐ์ฅ ์ต๊ทผ์ emit๋ ๋ฐ์ดํฐ๋ง ๋จ๊ธฐ๊ณ ํ๊ธฐํ๋ ์ ๋ต
๐ก LATEST ์ ๋ต์ด DROP ์ ๋ต์ด๋ ๋น์ทํ๋ฐ
DROP์ Downstream์์ ๋ฒํผ๋ฅผ ๋ชจ๋ ์ฒ๋ฆฌํ ๋ ๊น์ง ๋ค์ด์ค๋ ๋ฐ์ดํฐ๋ค์ ๋ค์ด์ฌ ๋ ๋ง๋ค
ํ๋ํ๋ DROPํ๋ค๊ฐ, ๋ฒํผ๊ฐ ๋น๋ฉด ๊ทธ ๋ emit๋ ๋ฐ์ดํฐ๋ฅผ ์ฐจ๋ก๋ก ๋ค์ ๋ฒํผ์ ๋ฃ๋ ์ ๋ต์ด๊ณ
LATEST๋ Downstream์์ ๋ฒํผ๋ฅผ ๋ชจ๋ ์ฒ๋ฆฌํ ๋ ๊น์ง ๋ค์ด์ค๋ ๋ฐ์ดํฐ๋ค์ ๊ทธ๋๋ก ๋๊ธฐ์ด๋ก ๋ชจ์๋จ๋ค๊ฐ,
๋ฒํผ๊ฐ ๋น๋ฉด ๊ทธ ๋ ๋ง์ง๋ง์ผ๋ก(์ต๊ทผ์) emit๋ ๋ฐ์ดํฐ๋ง ๋จ๊ธฐ๊ณ ๋๋จธ์ง ๋๊ธฐ์ด์ ๋ฐ์ดํฐ๋ค์ ํ๋ฒ์ ํ๊ธฐํ๋ ์ ๋ต์
-
- BUFFER ์ ๋ต
- BUFFER DROP LATEST
โ ๋ฒํผ๊ฐ ๊ฐ๋ ์ฐจ๋ฉด, ๋ฒํผ ์์ ์๋ ๋ฐ์ดํฐ ์ค ๊ฐ์ฅ ์ต๊ทผ์ ์ฑ์์ง ๋ฐ์ดํฐ๋ฅผ DROPํ๋ ์ ๋ต - BUFFER DROP OLDEST
โ ๋ฒํผ๊ฐ ๊ฐ๋ ์ฐจ๋ฉด, ๋ฒํผ ์์ ์๋ ๋ฐ์ดํฐ ์ค ๊ฐ์ฅ ์ค๋๋ ๋ฐ์ดํฐ๋ฅผ DROPํ๋ ์ ๋ต
- BUFFER DROP LATEST
- BUFFER ์ ๋ต
๐ก ๋ง์ฝ, Publisher์์ ๋ค์ด์ค๋ ๋ฐ์ดํฐ๋ฅผ ๋์์์ด emitํ๋๋ฐ Subscriber์ ์ฒ๋ฆฌ ์๋๊ฐ ๋๋ฆฌ๋ค๋ฉด,
๋๊ธฐํ๋ ๋ฐ์ดํฐ๊ฐ ์ง์์ ์ผ๋ก ์์ด๋ ๊ฒ์ ๋ฐฉ์นํ๊ฒ๋๋ฉด ์ค๋ฒํ๋ก์ฐ๊ฐ ๋ฐ์ํ๊ฒ ๋๊ณ ๊ฒฐ๊ตญ์ ์์คํ ์ด ๋ค์ด๋ ๊ฒ
โ Backpressure ์ ๋ต์ผ๋ก ์ด๋ฅผ ๋ฐฉ์ง
โ
[์ฐธ๊ณ ] https://projectreactor.io/docs/core/release/reference/#reactive.backpressure
โ๏ธ ๋ง๋ธ ๋ค์ด์ด๊ทธ๋จ (Marble Diagram)
- ํ๋์ ๋ฐ์ดํฐ๊ฐ ๋ค์ด์ด๊ทธ๋จ ์์์ ์๊ฐ์ ํ๋ฆ์ ๋ฐ๋ผ ์ด๋ป๊ฒ ๋ณํํ๋์ง ๋ฐ์ดํฐ์ ํ๋ฆ์ ํํํ ๊ทธ๋ฆผ
โ ๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ์์๋ Operator์ ๋ฐ๋ผ ๋ฐ์ดํฐ ํ๋ฆ์ด ๋ค์ํ๊ฒ ๋ณํํ๋๋ฐ,
์ด ๋ ๋ณต์กํ ๋ฐ์ดํฐ์ ํ๋ฆ์ ๋ง๋ธ ๋ค์ด์ด๊ทธ๋จ์ ํตํด ์ข ๋ ์ฝ๊ฒ ์ดํด ๊ฐ๋ฅ
- Reactor์์ ์ ๊ณตํ๋ ์๋ง์ Operaotr์ ๋ด๋ถ ๋์์ ์กฐ๊ธ ๋ ์ฝ๊ฒ ์ดํดํ๊ณ ,
ํด๋น Operator๋ฅผ ์ ์ ํ๊ฒ ์ฌ์ฉํ๋๋ฐ ๋์์ ์ค
โ๏ธ ๋ง๋ธ (Marble)
- ์๋ ๋จ์ด์ ์๋ฏธ๋ '๊ตฌ์ฌ'
- ํ๋์ ๋ฐ์ดํฐ๋ฅผ ๋ํ๋
โ ๋ง๋ธ ๋ค์ด์ด๊ทธ๋จ์ด ๊ตฌ์ฌ(ํ๋์ ๋ฐ์ดํฐ)์ด ์ด๋ค ํ๋ฆ์ผ๋ก ๊ตด๋ฌ๊ฐ๋์ง ํํํ ๊ฒ
โ Mono์ ๋ง๋ธ ๋ค์ด์ด๊ทธ๋จ
( Reactor์ ๋ฐ์ดํฐ ํ์
์ค ํ๋์ธ Mono๋ฅผ ๋ง๋ธ ๋ค์ด์ด๊ทธ๋จ์ผ๋ก ํํํ ๊ฒ )
- ํ๊ฐ์ ๊ตฌ์ฌ
โ 0๊ฑด ๋๋ 1๊ฑด์ ๋ฐ์ดํฐ๋ง emitํ๋ Reactor ํ์ ์์ ์๋ฏธ - ์ ์๋๋ก ๋๊ฐ์ ํ์ ๋ผ์ธ์ด ์๊ณ , ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ํ๋ฌ๊ฐ๋ ์๊ฐ์ ํ๋ฆ์ ํํ
(์ผ โ ์ค
๋ก ์๊ฐ์ด ํ๋ฆ )
โ ์๋ณธ Mono(Original Mono)์์ Sequence๊ฐ ์์๋๋ ๊ฒ์ ํ์๋ผ์ธ์ผ๋ก ํํ
โ
โก Mono์ Sequence์์ ๋ฐ์ดํฐ๊ฐ emit ๋๋ ๊ฒ์ ํํ
โ
โข ์์ง ๋ง๋ ๋ฐ๋ Mono์ Sequence๊ฐ ์ ์ ์ข ๋ฃ๋์๋ค๋ ๊ฒ์ ์๋ฏธ
โ
โฃ Mono์์ ์ง์ํ๋ ์ด๋ค Operator์์ ์ ๋ ฅ์ผ๋ก ๋ค์ด์ค๋ ๊ตฌ์ฌ ๋ชจ์์ ๋ฐ์ดํฐ๊ฐ ๊ฐ๊ณต ์ฒ๋ฆฌ๋๋ ๊ฒ์ ํํ
โ
โค Operator์์ ๊ฐ๊ณต ์ฒ๋ฆฌ๋ ๋ฐ์ดํฐ๊ฐ Downstream์ผ๋ก ์ ๋ฌ๋ ๋์ ํ์๋ผ์ธ
โ
โฅ Mono์์ emit๋ ๋ฐ์ดํฐ๊ฐ ์ฒ๋ฆฌ๋๋ ๊ณผ์ ์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค๋ฉด X๋ก ํ์
โ |๋ ์ ์ ์ข ๋ฃ / X๋ ์๋ฌ๋ก ์ธํ ๋น์ ์ ์ข ๋ฃ
โ Flux์ ๋ง๋ธ ๋ค์ด์ด๊ทธ๋จ
( Reactor์ ๋ฐ์ดํฐ ํ์
์ค ํ๋์ธ Flux๋ฅผ ๋ง๋ธ ๋ค์ด์ด๊ทธ๋จ์ผ๋ก ํํํ ๊ฒ )
- Mono์๋ ๋ฌ๋ฆฌ ์ฌ๋ฌ ๊ฐ์ ๊ตฌ์ฌ
โ ์ฌ๋ฌ ๊ฐ(0 … N)์ ๋ฐ์ดํฐ๋ฅผ emitํ๋ Reactor ํ์ ์์ ์๋ฏธ
( โฌ๏ธ ์๋ โ ~ โฅ์ ๊ทธ๋ฅ ํ๋ฅผ ์ฝ๋ ๋ฐฉ๋ฒ์ด๋ฏ๋ก Mono์ ๊ฐ์ )
โ
โ ์๋ณธ Flux์์ Sequence๊ฐ ์์๋๋ ๊ฒ์ ํ์๋ผ์ธ์ผ๋ก ํํ
โ
โก Flux์ Sequence์์ ๋ฐ์ดํฐ๊ฐ emit ๋๋ ๊ฒ์ ํํ
โ
โข ์์ง ๋ง๋ ๋ฐ๋ Flux์ Sequence๊ฐ ์ ์ ์ข ๋ฃ๋์๋ค๋ ๊ฒ์ ์๋ฏธ
โ
โฃ Flux์์ ์ง์ํ๋ ์ด๋ค Operator์์ ์ ๋ ฅ์ผ๋ก ๋ค์ด์ค๋ ๊ตฌ์ฌ ๋ชจ์์ ๋ฐ์ดํฐ๊ฐ ๊ฐ๊ณต ์ฒ๋ฆฌ๋๋ ๊ฒ์ ํํ
โ
โค Operator์์ ๊ฐ๊ณต ์ฒ๋ฆฌ๋ ๋ฐ์ดํฐ๊ฐ Downstream์ผ๋ก ์ ๋ฌ๋ ๋์ ํ์๋ผ์ธ
โ
โฅ Flux์์ emit๋ ๋ฐ์ดํฐ๊ฐ ์ฒ๋ฆฌ๋๋ ๊ณผ์ ์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค๋ฉด X๋ก ํ์
โ |๋ ์ ์ ์ข ๋ฃ / X๋ ์๋ฌ๋ก ์ธํ ๋น์ ์ ์ข ๋ฃ
๐ก main ์ฐ๋ ๋ / ๋ฐ๋ชฌ ์ฐ๋ ๋
โ โ
โ๏ธ main ์ฐ๋ ๋
โ ์ฃผ ์ฐ๋ ๋
โ
โ๏ธ ๋ฐ๋ชฌ ์ฐ๋ ๋
โ ๋ณด์กฐ ์ฐ๋ ๋ ( ์ฃผ ์ฐ๋ ๋์ ์ํฅ์ ๋ฐ๋ ์ฐ๋ ๋ )
โ ์ฃผ ์ฐ๋ ๋๊ฐ ์ข ๋ฃ๋๋ฉด ๋ฐ๋ผ์ ์ข ๋ฃ๋จ
โ map() Operator์ ๋ง๋ธ ๋ค์ด์ด๊ทธ๋จ ์์
map()
Operator
โ ์ ๋ ฅ์ผ๋ก ๋ค์ด์ค๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๋ฐ์๊ฐ ๊ตฌํํ๋ ๋์๋๋ก ๋ณํํด์ Downstream์ผ๋ก ์ ๋ฌํ๋ ์ญํ- ์ ๊ทธ๋ฆผ์ ์ดํด๋ณด๋ฉด,
์์ sequence์์ x๋ก ๋ค์ด๊ฐ ๋ฐ์ดํฐ๊ฐ ๋์ผํ ์์ ๊ฒฐ๊ณผ๊ฐ์ผ๋ก ๋ณํ๋์ด Downstream์ผ๋ก ์ ๋ฌ๋๋ ๊ฒ์ ์ ์ ์์
โ๏ธ ์ค์ผ์ค๋ฌ (Scheduler)
- ์ฐ๋ ๋ ๊ด๋ฆฌ์
โ ์ฌ๋ฌ ์ฐ๋ ๋๋ค์ ์์ฝ๊ฒ ๊ด๋ฆฌ
โ ๋ณต์กํ ๋ฉํฐ์ฐ๋ ๋ฉ ํ๋ก์ธ์ค๋ฅผ ๋จ์ํ๊ฒ ํด์ค - Reactor Sequence ์์์ ์ฒ๋ฆฌ๋๋ ๋์๋ค์ ํ๋ ์ด์์ ์ฐ๋ ๋์์ ๋์ํ๋๋ก ๋ณ๋์ ์ฐ๋ ๋๋ฅผ ์ ๊ณตํด ์ฃผ๋ ๊ฒ
โ Scheduler ์ ์ฉ Operator
( ์ ์ ํ ์ํฉ์ ๋ง๋ ์ฐ๋ ๋๋ฅผ ์ถ๊ฐ๋ก ์์ฑํ๋ Operator )
โ๏ธ subscribeOn()
Operator
- ๋ฐ์ดํฐ ์์ค์์ ๋ฐ์ดํฐ๋ฅผ emitํ๋ ์๋ณธ Publisher์ ์คํ ์ฐ๋ ๋๋ฅผ ์ง์ ํ๋ ์ญํ
- ๊ตฌ๋ ์ง ํ ์คํ๋๋ Operator ์ฒด์ธ์ ์คํ ์ฐ๋ ๋๋ฅผ Scheduler๋ก ์ง์ ํ ์ฐ๋ ๋๋ก ๋ณ๊ฒฝ
โ๏ธ doOnSubscribe() Operator
- ๊ตฌ๋ ๋ฐ์ ์ง ํ์ ํธ๋ฆฌ๊ฑฐ ๋๋ Operator
- ๊ตฌ๋ ์ง ํ์ ์ด๋ค ๋์์ ์ํํ๊ณ ์ถ๋ค๋ฉด doOnSubscribe()์ ๋ก์ง์ ์์ฑํ๋ฉด ๋จ
- ์ด ์์ subscribeOn() Operator ์ฌ์ฉํ ๊ฒฝ์ฐ doOnSubscribe()์ ๋ก์ง์ ์ฐ๋ ๋๊ฐ ๋ฐ๋์ง ์๊ณ main์์ ์คํ๋จ
- ์ดํ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๊ณ emitํ๋ ๋จ๊ณ๋ถํฐ๋ ๋ค๋ฅธ ์ฐ๋ ๋์์ ์คํ
- ์ฃผ๋ก
Schedulers.boundedElastic()
์ฌ์ฉ
โ๏ธ publishOn()
Operator
- ์ ๋ฌ ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณต ์ฒ๋ฆฌํ๋ Operator ์์ ์ถ๊ฐํด์ ์คํ ์ฐ๋ ๋๋ฅผ ๋ณ๋๋ก ์ถ๊ฐํ๋ ์ญํ
- publishOn() ๊ธฐ์ค Downstream ์ฐ๋ ๋๊ฐ publishOn()์ Scheduler๋ก ์ง์ ํ ์ฐ๋ ๋๋ก ๋ณ๊ฒฝ
โ๏ธ doOnNext() Operator
- doOnNext() ๋ฐ๋ก ์์ ์์นํ Operator๊ฐ ์คํ๋ ๋, ํธ๋ฆฌ๊ฑฐ ๋๋ Operator
- ์ฃผ๋ก
Schedulers.parallel()
์ฌ์ฉ
๐ก Operator ์ฒด์ธ๋ง๋ค ์คํ ์ฐ๋ ๋๋ฅผ ๊ตฌ๋ถํด์ ์คํํ ์ ์๋๋ก ํ๋ ์ด์
Spring WebFlux ๊ธฐ๋ฐ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ ์์ ์ฐ๋ ๋๋ก ๋๋์ ์์ฒญ์ Non-Blocking ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ ๊ตฌ์กฐ์
์ด ๊ตฌ์กฐ๋ ์ฐ๋ ๋๊ฐ ๋ณต์กํ ๊ณ์ฐ์ด ํ์ํ ์์ ์ ๊ฒฝ์ฐ, ์๋ต ์ง์ฐ์ด ๋ฐ์ํ ์ ์์ !
โ Scheduler๋ฅผ ํตํด ๋ณ๋์ ์ฐ๋ ๋๋ฅผ ์์ฑํ ํ, ๋ณต์กํ ๊ณ์ฐ์ ์ํํ๋๋ก ํจ
[Scheduler ์ง์ ์ฐ๋ ๋ ์ ํ ์ฐธ๊ณ ]
โ๏ธ Operators
- Reactor์์ ๊ฐ์ฅ ์ค์ํ ๊ตฌ์ฑ์์
โ ์ํฉ๋ณ๋ก ๋ถ๋ฅ๋ Operator ๋ชฉ๋ก
[Which operator do I need? ์ฐธ๊ณ ]
โ ์๋ก์ด Sequence๋ฅผ ์์ฑ(Creating)ํ๊ณ ์ ํ ๊ฒฝ์ฐ
just()
- โญ
fromStream()
โ Java์ Stream์ ์ ๋ ฅ์ผ๋ก ์ ๋ฌ ๋ฐ์ emitํ๋ Operator - โญ
fromIterable()
โ Java์Iterable์ ์ ๋ ฅ์ผ๋ก ์ ๋ฌ ๋ฐ์ emitํ๋ Operator
( List, Map, Set ๋ฑ์ ์ปฌ๋ ์ ์ fromIterable()์ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ ๊ฐ๋ฅ ) fromArray()
range()
interval()
empty()
never()
defer()
using()
generate()
- โญ
create()
โ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก Signal ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํค๋ Operator
โ ํ ๋ฒ์ ์ฌ๋ฌ ๊ฑด์ ๋ฐ์ดํฐ๋ฅผ ๋น๋๊ธฐ์ ์ผ๋ก emitํ ์ ์๋ Operator
โ๏ธ Signal
โ Publisher๊ฐ ๋ฐ์์ํค๋ ์ด๋ฒคํธ
โก ๊ธฐ์กด Sequence์์ ๋ณํ ์์
(Transforming)์ด ํ์ํ ๊ฒฝ์ฐ
- โญ
map()
โ ์์์ ๊ฐ๊ณต์ฒ๋ฆฌ ํด์ค - โญ
flatMap()
โ flatMap() ๋ด๋ถ๋ก ๋ค์ด์ค๋ ๋ฐ์ดํฐ๋ง๋ค ํ๋์ ์๋ก์ด Sequence๊ฐ ์์ฑ๋จ
( ๋ค์ด์ค๋ Sequence๋ ํ๋์ธ๋ฐ, ๋ด๋ถ์์ ์๋๋๋ Sequence๋ ์ฌ๋ฌ๊ฐ )
โ flatMap() ๋ด๋ถ์์ ์ ์ํ๋ Sequence = Inner Sequece
โ But, ๊ฐ ์ฐ๋ ๋์ ์์ ์ ์ฒ๋ฆฌ ์์๋ฅผ ๋ณด์ฅํ์ง ์์ ( ์ถ๋ ฅ ๋๋ค ) - โญ
concat()
โ ์ ๋ ฅ์ผ๋ก ์ ๋ฌํ๋ Publisher์ Sequence๋ฅผ ํ๋๋ก ์ด์ด๋ถ์ฌ์ ์ฐจ๋ก๋๋ก ๋ฐ์ดํฐ๋ฅผ emitํจ
( ์์๋๋ก emit๋จ ) collectList()
collectMap()
merge()
- โญ
zip()
โ ์ ๋ ฅ์ผ๋ก ์ ๋ฌ๋๋ ์ฌ๋ฌ ๊ฐ์ Publisher Sequence์์ emit๋ ๋ฐ์ดํฐ๋ฅผ ๊ฒฐํฉํ๋ Operator
โ ๊ฐ๊ฐ์ Sequence์์ emit๋๋ ๋ฐ์ดํฐ ์ค ๊ฐ์ ์ฐจ๋ก(index)์ ๋ฐ์ดํฐ๋ค์ด ๊ฒฐํฉ
( ๋ Sequence์ emit ์์ ์ด ๋งค๋ฒ ๋ค๋ฅด๋๋ผ๋ emit ์์ ์ด ๋ฆ์ ๋ฐ์ดํฐ๊ฐ emit๋ ๋๊น์ง ๋๊ธฐ ํ๋ค๊ฐ ๋ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ ๋ฐ์ ๊ฒฐํฉ )
๐ก ์ฌ๊ธฐ์์ '๊ฒฐํฉ'
โ ๊ฐ Publisher๊ฐ emitํ๋ ๋ฐ์ดํฐ๋ฅผ ํ๋์ฉ ์ ๋ฌ ๋ฐ์์ ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ๋ง๋ ํ์ Downstream์ผ๋ก ์ ๋ฌํ๋ค๋ ์๋ฏธ
then()
switchIfEmpty()
โ ๋ค์ด์ค๋ ๋ฐ์ดํฐ๊ฐ ์์ผ๋ฉด ๋ด๋ถ์์ ์ Sequence๋ฅผ ๋ง๋ค์ด์ ๊ทธ Sequence์ ๊ฒฐ๊ณผ ๋ฐ์ดํฐ๋ฅผ ๋ฆฌํดํ ์ ์๊ณ ,
๋ค์ด์ค๋ ๋ฐ์ดํฐ๊ฐ ์์ผ๋ฉด ๊ทธ ๋ฐ์ดํฐ๋ฅผ ๋ฆฌํดand()
when()
โข Sequence ๋ด๋ถ์ ๋์์ ํ์ธ(Peeking)ํ๊ณ ์ ํ ๊ฒฝ์ฐ
doOnSubscribe
- โญ
doOnNext()
โ ๋ฐ์ดํฐ emit ์ ํธ๋ฆฌ๊ฑฐ ๋์ด ๋ถ์ ํจ๊ณผ(side-effect)๋ฅผ ์ถ๊ฐํ ์ ์๋ Operator
โ ๋ฆฌํด๊ฐ์ด ์์
โ ์ฃผ๋ก ๋ก๊น (๋ก๊ทธ๋ฅผ ๊ธฐ๋ก ๋๋ ์ถ๋ ฅํ๋ ์์ )์ ์ฌ์ฉํ์ง๋ง,
๋ฐ์ดํฐ๋ฅผ emitํ๋ฉด์ ํ์ํ ์ถ๊ฐ ์์ ์ด ์๋ค๋ฉด doOnNext()์์ ์ฒ๋ฆฌ
โ๏ธ ๋ถ์ ํจ๊ณผ (side-effect)
โ ์ด๋ค ๋์์ ์คํํ๋ ๋ฆฌํด ๊ฐ์ด ์๋ ๊ฒ
doOnError()
doOnCancel()
doFirst()
doOnRequest()
doOnTerminate()
doAfterTerminate()
doOnEach()
doFinally()
- โญ
log()
โ Publisher์์ ๋ฐ์ํ๋ Signal ์ด๋ฒคํธ ๋ง๋ค ๋ก๊ทธ๋ก ์ถ๋ ฅํด์ฃผ๋ ์ญํ
โ ์ํ๋ ๋งํผ ์ถ๊ฐ ๊ฐ๋ฅ
โฃ Sequence์์ ๋ฐ์ดํฐ ํํฐ๋ง(Filtering)์ด ํ์ํ ๊ฒฝ์ฐ
- โญ
filter()
โ ๋ค์ด์ค๋ ๋ฐ์ดํฐ๋ฅผ ์ด๋ค ์กฐ๊ฑด์ ๋ง์ถฐ์ ํํฐ๋ง take()
โ ํ๋ผ๋ฏธํฐ์ ์ฒ๋ฆฌํ๊ณ ์ถ์ ๋ฐ์ดํฐ์ ์๊ฐ ๋ค์ด๊ฐignoreElements()
distinct()
- โญ
take()
next()
skip()
sample()
single()
โค ์๋ฌ๋ฅผ ์ฒ๋ฆฌ(Handling errors)ํ๊ณ ์ ํ ๊ฒฝ์ฐ
- โญ
error()
โ Reactor Sequence ์์์ ์๋์ ์ผ๋ก ์์ธ๋ฅผ ๋์ ธ์ onError Signal ์ด๋ฒคํธ ๋ฐ์์ํค๋๋ฐ ์ฌ์ฉ
( throw ์ ๊ฐ์ ) - โญ
timeout()
โ ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง ์๊ฐ๋์ emit๋๋ ๋ฐ์ดํฐ๊ฐ ์์ผ๋ฉด onError Signal ์ด๋ฒคํธ ๋ฐ์ ์ํด
โretry()
Operator์ ํจ๊ป ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์
( ์ผ์ ํ ์๊ฐ ์์ ์์ค๋ฉด ๋ค์ ์ฌ์๋ ํด๋ด๋ผ ! ) onErrorReturn()
onErrorResume()
onErrorMap()
doFinally()
- โญ
retry()
โ Sequence ์์์ ์๋ฌ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ, ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง ์ซ์๋งํผ ์ฌ๊ตฌ๋ ํด์ Sequence๋ฅผ ๋ค์ ์์
โ ํ๋ผ๋ฏธํฐ์ ์ฌ์๋ํ ์ ์๋ ํ์๊ฐ ๋ค์ด๊ฐ
โtimeout()
Operator์ ํจ๊ป ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์
๐ ์ค์ต
- projects - be-template-reactor
( ๊ตฌํ ์ค์ต๋ณด๋จ ์์์ ๊ฐ๊น์ )
๐ ๋๋์
์ฌ์ค ๋ญ๊ฐ Stream์ด๋ ๋น์ทํด์ ์ดํด๋ ๊ทธ๋๋ ์ฝ๊ธด ํ๋๋ฐ
Mono์ Flux๋ฅผ ๊ทธ๋์ ์ธ์ ์ด๋ป๊ฒ ์จ์ผ ํ๋์ง๋ ์์ง ์ ๋ชจ๋ฅด๊ฒ ๋ค ! ใ
ใ
๊ทธ๋ฆฌ๊ณ Operator ๋๋ฌด ๋ง์..
๋์ค์ ๋ง์ ๊ณต๋ถํด์ผ๊ฒ ๋ท
( ๋ณธ ๊ฒ์๋ฌผ์ 2022/12/01์ ์์ฑํ ๊ธ์ ์ฎ๊ธด ๊ธ์ ๋๋ค. ์๋ฌธ์ ์๊ธฐ์ ์์! )
'โข CodeStates BootCamp > Section 4' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๐ [Section4] 10. [Cloud] ์ด์ ํ๊ฒฝ ๊ตฌ์ฑ (0) | 2023.04.13 |
---|---|
๐ [Section4] 9. [Spring WebFlux] Spring WebFlux (1) | 2023.04.13 |
๐ [Section4] 7. [Spring WebFlux] ๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ (0) | 2023.04.13 |
๐ [Section4] 6. [Spring Security] OAuth2 2 (0) | 2023.04.13 |
๐ [Section4] 5. [ Spring Security ] OAuth2 1 (0) | 2023.04.13 |