๐ 0. ์ด์ ๊ธ (0. ๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ์ ์๊ฐ)
๐ค 1. Mono์ Flux๋ฅผ ์๊ฐํฉ๋๋ค.
1-1. Flux
Flux<T>๋ Reactive Stream์ Publisher์ ํด๋นํ๋ ๊ฐ์ฒด์ ๋๋ค.
ํผ๋ธ๋ฆฌ์ ๊ฐ ๋ฌด์์ธ์ง ๋ชจ๋ฅธ๋ค๋ฉด, ์ง๋ ํฌ์คํ ์ ์ฐธ๊ณ ํด์ฃผ์๊ธฐ ๋ฐ๋๋๋ค.
๊ณต์ ๋ ํผ๋ฐ์ค์ Flux์ ๋๋ค. "All Implemented Interfaces"๋ฅผ ํ์ธํ๋ฉด, ๋ฆฌ์กํฐ๋ธ ์คํธ๋ฆผ์์ ์ ์ํ Publisher<T>๋ฅผ ์์๋ฐ๊ณ ์๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ด Flux๊ฐ Item๋ค์ Produce(Emit)ํ๋ค๋ ๊ฒ์ ์ ์ ์๊ณ , Subscriber๊ฐ subscribeํ๊ธฐ ์ ๊น์ง๋ ์๋ฌด๋ฐ ๋ฐ์์ด ์๋ค๋ ๊ฒ๋ ์ ์ ์์ต๋๋ค.
Flux๋ 0๊ฐ๋ถํฐ N๊ฐ๊น์ง์ Tํ์ ์ ์์๋ฅผ ๋ฐฉ์ถํ๊ฒ ๋ฉ๋๋ค. onNext ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ์ด๋๋ถํฐ ๋ฐฉ์ถํ๊ฒ ๋ฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ onComplete ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ์๋ฃํ๊ณ , onError ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ์๋ฌ๋ฅผ ๋ฐ์์ํต๋๋ค. ๋ ์ด๋ฒคํธ๋ ํฐ๋ฏธ๋ ์ด๋ฒคํธ๋ก ํ๋ฆ์ ์ข ๋ฃ์ํต๋๋ค. ์ด๋ฌํ ํฐ๋ฏธ๋ ์ด๋ฒคํธ๊ฐ ๋ฐ์(ํธ๋ฆฌ๊ฑฐ)ํ์ง ์์ผ๋ฉด, Flux๋ ๋ฌดํํ ์ ์ง๋ฉ๋๋ค.
Flux๋ Operator๊ฐ ๋ง์ต๋๋ค. Flux ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ Generate Operator, Flux๋ฅผ ๋ณํํ๋ Transform Operator, ์ํ์ค๋ฅผ ์กฐ์ /์กฐ์ํ๋ Orchestrate Operator๊ฐ ์์ต๋๋ค.
๊ณต์ ๋ ํผ๋ฐ์ค์, "Static Method" ํํธ๋ฅผ ์ดํด๋ณด๋ฉด, ์ ์ ํฉํ ๋ฆฌ ๋ฉ์๋๊ฐ ๋ง์ต๋๋ค. ์ด๋ฅผ ์ฌ์ฉํด์ Flux ๋ฆฌ์์ค๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
ํ์ธํด๋ณด๋ฉด ๋๋ฌด ๋ง์์ ๋ชจ๋ ๋ค ์์งํ๋ ๊ฒ์ ์ด๋ ต๊ณ , ์์ฃผ ์ฌ์ฉํ๋ ๋ฉ์๋๋ฅผ ํ์ธํ๊ฑฐ๋ ํ์์ ์์นญํด์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด ์ ํฉํฉ๋๋ค.
์์ Instance Methods๋ Operator๋ก, ๋น๋๊ธฐ ํ๋ก์ธ์ฑ ํ์ดํ๋ผ์ธ์ ๋น๋ํ ์ ์๊ณ ๋น๋๊ธฐ ์ํ์ค๋ฅผ ๋ง๋ค์ด ๋ด๊ฒ ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก, instance method ํํธ์ ์๋ ๋ฉ์๋๋ฅผ ์ ํ์ฉํ๋ ๊ฒ์ด ๊ณง ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ ์ ์ค๊ณํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
Flux์ subscribe๋, ๋ฉํฐ์บ์คํ ์ฐ์ฐ์ธ Flux์ publish, publishNext๋ ํ์ดํ๋ผ์ธ์ ์ ์ฉ ์ธ์คํด์ค๋ฅผ ๊ตฌ์ฒดํํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฐ์ดํฐ ํ๋ก์ฐ๋ฅผ ์์ ๋ฃ๋ ํธ๋ฆฌ๊ฑฐ๊ฐ ๋ฉ๋๋ค. ๋ฒ์ญ์ ์ํ ์ค๋ช ์ด ๊ต์ฅํ ์๋ฟ์ง ์์ ์ ์์ง๋ง, ์ฝ๊ฒ ์ค๋ช ํ๋ฉด ์๋ค์ ์จ์ผ Flux์ ๋ด๊ธด Item๋ค์ด ํ๋ฌ๋ค์ด๊ฐ๊ณ , lazily captured(ex. supplier์ ์ํด ๊ฐ์ด ์์ฑ๋๋ ๊ฒฝ์ฐ)์ ๊ฒฝ์ฐ์ ์๋ค์ด ์์ผ๋ฉด ๋ฐ์ดํฐ ์์ฑ์ด ๋์ง ์๋๋ค๋ ์๋ฏธ์ ๋๋ค.
์ ๊ทธ๋ฆผ์ Flux๋ฅผ ์ค๋ช ํ๋ ๊ทธ๋ฆผ์ ๋๋ค.
๊ทธ๋ฆผ์ ๊ฐ ๋๊ทธ๋ผ๋ฏธ๋ Flux๋ก๋ถํฐ ๋น ์ ธ๋์จ ๋ฐ์ดํฐ๋ค์ ์๋ฏธํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์๋จ๊ณผ ํ๋จ์ ์ค๋ฅธ์ชฝ์ผ๋ก ํฅํ๋ ํ์ดํ๋ Flux์ ํ์๋ผ์ธ์ ์๋ฏธํฉ๋๋ค. ์ค๋ฅธ์ชฝ์ผ๋ก ํฅํ๋ค๋ ๊ฒ์ ์๊ฐ์ ํ๋ฆ์ด ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ์ผ๋ก ํ๋ฅด๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
์ค๊ฐ์ ์ ์ ๊ณผ operator ๋ฐ์ค๋, Flux์ ์ ์ฉ๋๋ ๋ณํ์ ์๋ฏธํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์๋จ ํ์ดํ์ ๊ฐ์ฅ ์ค๋ฅธ์ชฝ์ ์์ง์ ์ Flux์ ์ข ๋ฃ๋ฅผ ์๋ฏธํ๊ณ , ํ๋จ์ X๋ ์ด๋ ํ ์ด์ ์ ์ํด ๋น์ ์์ ์ธ Flux ์ข ๋ฃ๋ฅผ ์๋ฏธํฉ๋๋ค.
1-2. Mono
Mono ์ญ์ ํฌ๊ฒ ๋ค๋ฅด์ง ์์ต๋๋ค.
Mono ์ญ์ Flux์ ๋ง์ฐฌ๊ฐ์ง๋ก Reactive Stream์ Publisher๋ฅผ ์์๋ฐ์ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ Mono๋ ์์ดํ ์ produceํ ์ ์๊ณ , subscriber๊ฐ subscribeํ๋ฉด Emit์ ํ ์ ์๋ค๋ ๊ฒ์ ๋์ผํฉ๋๋ค.
Mono์ Flux์ ์ฐจ์ด๋, ๋ด๋ถ์ ์์ดํ ์ ์์ ๋๋ค.
Flux๋ 0๊ฐ~N๊ฐ์ ์์ดํ ์ ๋ฐฉ์ถํ ์ ์๋ ๊ฐ์ฒด์๋ค๋ฉด, Mono๋ 0๊ฐ~1๊ฐ์ ์์ดํ ์ ๋ฐฉ์ถํ ์ ์๋ ๊ฐ์ฒด์ ๋๋ค.
Mono ์ญ์ ๋์ผํ๊ฒ ๋ค์ํ Operator๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
Flux์ ๋์ผํ๊ฒ ์์ฑํ ์ ์๋ static method๋ค์ด ์๊ณ , ๋น๋๊ธฐ ํ์ดํ๋ผ์ธ์ ๊ตฌ์ถํ๊ณ ์ํ์ค๋ฅผ ๋ง๋ค์ด๋ด๋ instance method๋ค์ด ์์ต๋๋ค.
Mono๋ฅผ ์ค๋ช ํ๋ ๊ทธ๋ฆผ์ ๋๋ค. Flux์ ํฌ๊ฒ ๋ค๋ฅธ ์ ์ด ์์ต๋๋ค.
๋ค๋ง Optional Item์ด Mono๋ก๋ถํฐ ๋ฐฉ์ถ๋๋ค๋ ๊ฒ๋ง ์ฐจ์ด๊ฐ ์์ต๋๋ค.
onNext ์ ํธ๋ฅผ ํตํด ์ต๋ ํ๋์ ์์ดํ ์ ๋ฐฉ์ถํ๊ณ , onComplete ์ ํธ๋ฅผ ํตํด Mono๊ฐ ์จ์ ํ ์ข ๋ฃ๋์๋ค๋ ๊ฒ์ ํํํ๊ณ , onError๋ฅผ ํตํด Mono์ ์คํจ๋ฅผ ๋ํ๋ผ ์ ์์ต๋๋ค.
๐ค 2. Mono์ Flux์ ์ฌ์ฉ๋ฒ
Mono์ Flux์ Operator๋ ์ง๋์น๊ฒ ๋ง๊ธฐ ๋๋ฌธ์, ๊ณต์ ๋ ํผ๋ฐ์ค์์๋ ๋ชจ๋ ๋ฉ์๋๋ฅผ ์์งํ์ง ์๊ณ , Which operator do I need? ์ฑํฐ์ ๋ฉ์๋๋ฅผ ์ดํด๋ณด๋ ๊ฒ์ ๊ถ์ฅํ๊ณ ์์ต๋๋ค. ์ด๋ฅผ ๋ณด๊ณ ๋ฒ์ญ ๋ฐ ํ์ตํ ํฌ์คํธ๋ฅผ ์ฃผ๊ธฐ์ ์ผ๋ก ์ ๋ก๋ ํ๋๋ก ํ๊ฒ ์ต๋๋ค.
[๋งํฌ] https://projectreactor.io/docs/core/release/api/reactor/core/publisher/Flux.html (Flux reactor reference)
[๋งํฌ] https://www.youtube.com/watch?v=v0BnqWLxYjQ&list=LL&index=7&t=77s (๋ฐฑ๊ธฐ์ ๋ ์ ํ๋ธ)