๐ค 1. ๋ฆฌ์กํฐ(Reactor)๋ ๋ฌด์์ธ๊ฐ์?
๊ฐ๋จ ์ฉ์ด ์ ๋ฆฌ
- Reactive Stream : JVM ์์์ ์คํ๋ ์ ์๋ ๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์คํ์ํจ ๊ฒ์ผ๋ก ์ดํดํ ์ ์์ต๋๋ค. ์ธํฐํ์ด์ค์ ํํ๋ก ์คํ์ด ์ ์๋์ด ์์ต๋๋ค.
- Reactor3 : Reactive Stream ์คํ์ ๊ตฌํํ ๊ตฌํ์ฒด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. JVM ์์์ ๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ์ด๋ผ๋ ์๋ก์ด ํจ๋ฌ๋ค์์ ์ ์ฉ์ํค๊ธฐ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค.
- TCK(Reactive Streams Technology Compatibility Kit) : Reactive Streams ๊ตฌํ์๊ฐ ์ฌ์์ ์ ์๋ ๊ท์น์ ๋ํด ๊ตฌํ์ ํ์ธํ๊ธฐ ์ํ ์ง์นจ์ผ๋ก, TestNG๋ผ๋ Java์ ํ ์คํธ ํ๋ ์ ์ํฌ๋ก ๊ฐ๋ฐ์ด ๋์์ต๋๋ค.
๋ฆฌ์กํฐ๋ธ ์คํธ๋ฆผ์ ์คํ์ JVM ์์์ ์คํ๋ ์ ์๋๋ก ๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฐ์ ์์ ์ฃผ๋์ ์ผ๋ก ๊ฐ๋ฐ๋์ด ํ์คํ ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
4๊ฐ์ง์ ๋งค์ฐ ๋จ์ํ ์ธํฐํ์ด์ค๋ฅผ ํฌํจํ ํํ๋ก ๊ตฌ์ฑ์ด ๋์ด์์ผ๋ฉฐ, ํด๋น ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํจ๊ณผ ๋์์ TCK(Reactive Streams Technology Compatibility Kit) ๊ท์น์ ํต๊ณผํด์ผ Reactor Streams๋ฅผ ๊ตฌ์ถํ ๊ฒ์ด๋ผ๊ณ ๋ณผ ์ ์์ต๋๋ค.
์ฐ๋ฆฌ๋ ๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ์ ํ๊ธฐ ์ํด ์ด๋ ๊ฒ Reactive Stream ์ธํฐํ์ด์ค๋ฅผ ๋ชจ๋ ๊ตฌํํ๊ณ , TCK๋ฅผ ํต๊ณผํ ๊ตฌํ์ฒด๋ฅผ ์ฌ์ฉํ๊ฒ ๋ฉ๋๋ค. ๊ทธ ๊ตฌํ์ฒด์ ์ข ๋ฅ ์ค ํ๋๊ฐ ๋ฐ๋ก Reactor3์ ํด๋นํฉ๋๋ค. ๋ฆฌ์กํฐ๋ค์ Reactor3, RxJava2, Akka Streams ๋ฑ ๋ค์ํ ๊ตฌํ์ฒด๋ค์ด ์กด์ฌํฉ๋๋ค. ๋ํ Reacitve Streams๋ ๋ฆฌ์กํฐ ๊ฐ์ ์ํธ ์ด์ฉ(ํธํ ๊ฐ๋ฅํ๋๋ก)์ด ๊ฐ๋ฅํ๋๋ก ๋์ํ๋ ๋ฐฉ๋ฒ์ ์ค๊ณํ์ต๋๋ค.
Reactive Streams๋ ์ฌ์ ํ ์ฌ์ฉ์ ์ ์ฅ์์๋ Low-Level์ ๊ธฐ์ ์ ๋๋ค. ๊ทธ๋์ ์ฐ๋ฆฌ๋ ๊ตฌํ์ฒด์ธ Reactor3๋ฅผ ์ฌ์ฉํฉ๋๋ค.
Reactor3๋ Reactive Streams Publisher ์์ ๋น๋ํจ์ผ๋ก์จ ๋ค์ํ ์ํฉ์์ ์ํฅ๋ ฅ์ ๋ฏธ์น ์ ์๋๋ก High Level API๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ ๋ชฉ์ ์ผ๋ก ๊ฐ๋ฐ๋์์ต๋๋ค.
๐ค 2. ๊ทธ๋ผ ๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ์ด ๋ญ๊ฐ์? / ์ ์ฌ์ฉํ๋์?
๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ(Reactive Programming)์ ๋น๋๊ธฐ์ ์ธ ํ๋ก์ธ์ฑ ํ์ดํ๋ผ์ธ์ ๋ง๋ค๊ธฐ ์ํ ๋ชฉ์ ์ผ๋ก ๊ฐ๋ฐ๋์๊ณ , ํจ์ํ ํ๋ก๊ทธ๋๋ฐ๊ณผ ์ ์ฌํ "์ ์ธ์ ์ฝ๋"๋ฅผ ์ฌ์ฉํ ์๋ก์ด ํจ๋ฌ๋ค์์ ๋๋ค.
๋ฐฑ๊ธฐ์ ๋๋ ์ด "์ ์ธ์ ์ฝ๋"์ ์๋ฏธ์ ๋ํด ๊ต์ฅํ ์์ํด ํ์ ์ ๋ค์ํ ๊ธ์ ์์นํด๋ณด์ จ์ง๋ง, ๋ช ํํ ๋ต์ ์ป์ง ๋ชปํ์ต๋๋ค.
๊ทธ๋์ ์ถ๊ฐ์ ์ผ๋ก ์ฐพ์๋ณธ ๊ฒฐ๊ณผ,
๊ธฐ์กด์ ๋ช
๋ นํ ํ๋ก๊ทธ๋๋ฐ :
์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฌ์ฑํด ๋์๊ฐ๋ ๊ณผ์ ์๋ง ๊ด์ฌ์ ๋๋ ๋ฐฉ์์ ํ๋ก๊ทธ๋๋ฐ ์คํ์ผ. URL์์ ๊ณต๋ฐฑ์ ํ์ฉํ์ง ์๊ณ ํ์ดํ์ผ๋ก ๋ฐ๊พธ๋ ๊ณผ์ ์ ๊ทธ๋๋ก ์ฝ๋ฉํ๋ ๋ฐฉ์.
var string = 'THis is the midday show with Cheryl Waters';
var urlFriendly = "";
for(var i=0; i<string.length; i++){
if(string[i] === " "){
urlFriendly += "-";
}else{
urlFriendly += string[i];
}
}
console.log(urlFriendly);โ
์๋ก์ด ํจ๋ฌ๋ค์, ์ ์ธ์ ํ๋ก๊ทธ๋๋ฐ :
const string = 'This is the midday show with Cheryl Waters';
const urlFriendly = string.replace(/ /g, '-');
console.log(urlFriendly);
์ ์ธ์ ํ๋ก๊ทธ๋๋ฐ์์๋ ๊ตฌ์ฒด์ ์ธ ์ ์ฐจ ๋์ ์ replace๋ผ๋ ํจ์๋ฅผ ์ฌ์ฉํด ์ถ์์ ์ธ ๊ฐ๋
์ ํํํ์ต๋๋ค.
์ ์ธ์ ํ๋ก๊ทธ๋๋ฐ์ ์ฝ๋ ๊ตฌ๋ฌธ์์๋ ์ด๋ค ์ผ์ด ๋ฐ์ํด์ผ ํ๋์ง ๊ธฐ์ ํ๊ณ , ์ค์ ๋ก ๊ทธ ์์
์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์ถ์ํ๋ก ์๋ซ๋จ์ ๊ฐ์ถ์ด์ง๋๋ค.
[๋งํฌ : https://velog.io/@hyun_sang/%EB%AA%85%EB%A0%B9%ED%98%95-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EA%B3%BC-%EC%84%A0%EC%96%B8%EC%A0%81-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%EB%B9%84%EA%B5%90 ]
์ด๋ฌํ ๊ธ์ ์ฐพ์ ๋ณผ ์ ์์์ต๋๋ค. ์ฌ์ค ๋ช ํํ๊ฒ ์ ์๋ ๊ท์น ๊ฐ์๊ฒ ์กด์ฌํ์ง ์๊ธฐ ๋๋ฌธ์ ์๋ฟ์ง ์๊ณ ์ถ์์ ์ด๋ค๋ผ๊ณ ๋๋ ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค.
์ ๊ฐ ์ดํดํ ๋ฐ๋ก๋, ๊ฐ๊ฐ์ ์์ ํจ์์ ๊ทธ ํจ์๊ฐ ํ๋ ์ผ์ ์ ์ค๋ช ํ๋ ์ด๋ฆ์ ๋ถ์ฌ ๋ ์ฝ๊ธฐ ์ฝ๊ณ , ์ถ๋ก ํ๊ธฐ ์ฝ๊ฒ ๊ฐ๋ฐํ๋ฉฐ, ๋ด๋ถ ๊ตฌํ์ ๊ฐ์ถ์ด ๋๋ฌ๋์ง ์๋๋ก ํ๋ ๊ฒ์ผ๋ก ์ดํดํ์ต๋๋ค.
๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ์ ์ด๋ฒคํธ ๊ธฐ๋ฐ์ ๋ชจ๋ธ์ผ๋ก, ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ ์ค๋น๊ฐ ๋๋ฉด ์๋น์์๊ฒ pushํ๋ ๋ฐฉ์์ผ๋ก ๋์ํฉ๋๋ค.
์ด๋ก์จ ์ฐ๋ฆฌ๋ ๋น๋๊ธฐ์ ์ผ๋ก ์ด๋ฒคํธ์ ์ํ์ค๋ฅผ ๋ค๋ฃฐ ์ ์์ต๋๋ค.
๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ์ ์ด๋ฌํ ๊ตฌ์กฐ๋ฅผ ํตํด ๊ฐ์ง๊ณ ์๋ ์์์ ๋์ฑ ๋ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๊ณ , ๋ ๋ง์ ์ฌ์ฉ์๋ค์ ์์ฉํ ์ ์๋ ์ดํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค๋๋ก ๋์์ค๋๋ค.
๋ํ Runnable, Thread์ ๊ฐ์ Low-Level์ ์ง์ ์ ์ธ ๊ธฐ์ ์ฌ์ฉ์ผ๋ก ์ธํด ์คํธ๋ ์ค๋ฅผ ๋ฐ์ง ์๊ณ ๋ ๋ณํ / ๋ณ๋ ฌ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋๋ก ๋์์ฃผ๋ ๊ฒ์ด ํฐ ๋ฉ๋ฆฌํธ์ ํด๋นํฉ๋๋ค.
๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ์ ๋ ๊ฐ์ง ํต์ฌ ํค์๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ค๊ณ ๋์์ต๋๋ค. ๋ฐ๋ก "๋น๋๊ธฐ(Asynchronous)"์ "๋ ผ๋ธ๋กํน(Non-Blocking)"์ด์ฃ .
์ฆ, ๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ์ Callback ๊ธฐ๋ฐ API ํน์ Future ํค์๋๋ฅผ ๋์ฒดํ์ฌ ๋น๋๊ธฐ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ ํ๋ฅญํ ๋์์ด ๋๋ค๋ ๊ฒ์ ๋๋ค.
๋ํ ๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ์ ์ฌ์ฉํ๋ฉด ๋น๋๊ธฐ ๋ฐฉ์์ ์ฝ๋๋ฅผ ์ข ๋ readableํ๊ณ maintainableํ๋๋ก ๋ง๋ค์ด ์ค๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค.
๐ก 3. ์ฌ๊ธฐ๊น์ง ์ค๊ฐ ์ ๋ฆฌ!
๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ : ๋น๋๊ธฐ์ ์ธ ํ๋ก์ธ์ฑ ํ์ดํ๋ผ์ธ์ ๊ฐ๋ฐํ ์ ์์ผ๋ฉฐ, ์ด๋ฒคํธ ๊ธฐ๋ฐ์ ๋ชจ๋ธ์ ๋๋ค. ๋น๋๊ธฐ / ๋ ผ๋ธ๋กํน ๋ฐฉ์์ ํตํด ์์์ ํจ์จ์ ์ฌ์ฉ๊ณผ ๋ค์์ ์ฌ์ฉ์ ์์ฉ์ ๊ฐ๋ฅ์ผ ํฉ๋๋ค.
Reactors Streams : ์ด๋ฌํ ๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ์ ๊ฐ๋ฅ์ผ ํ๋๋ก ๋ง๋ ํ์คํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์ธํ ํ์ด์ค์ ํํ๋ก ์คํ์ด ์ ์๋์ด ์์ต๋๋ค.
Reactors3 : Reactors Streams ๊ตฌํํ ๊ตฌํ์ฒด, TCK๋ฅผ ํต๊ณผํ ๊ตฌํ์ฒด์ ํด๋นํ๋ฉฐ, ์ด๋ฅผ ํตํด ์ฐ๋ฆฌ๋ ์ฝ๊ฒ ๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ์ ํ ์ ์๋๋ก ๋ง๋ค์ด์ค๋๋ค.
๐ค 4. Reactive Streams Interface ๋ช ์ธ
๊ฐ๋จ ์์ฝ!
์๋ 4๊ฐ์ API Components๋ก ๊ตฌ์ฑ๋์ด ์์ต๋๋ค.
1. Publisher
2. Subscriber
3. Subscription
4. Processor
์์ธํ ๋ช ์ธ๋ ์๋์ ๊นํ๋ธ Readme์์ ํ์ธํ ์ ์์ต๋๋ค.
์ถ๊ฐ์ ์ธ ๊ณต๋ถ๋ฅผ ํตํด ๋์ค์ ์์ธํ ๊ณต๋ถํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค :)
๐ค 5. Reactive Stream Sequence์ ์ํธ์์ฉ
Reactive Stream์ ์ํ์ค๋ Publisher๊ฐ ๋ฐ์ดํฐ๋ฅผ ์์ฐํด๋ ๋๋ค.
ํ์ง๋ง, ๊ธฐ๋ณธ์ ์ผ๋ก Subscriber๊ฐ ๋ฑ๋ก๋๊ธฐ(๊ตฌ๋ ํ๊ธฐ)์ ๊น์ง ์๋ฌด๋ฐ ์ผ๋ ํ์ง ์์ต๋๋ค.
์ฆ, Publisher๋ Subscriber๊ฐ ๋ฑ๋ก๋๋ ์์ ๋ถํฐ ๋ฐ์ดํฐ๋ฅผ push ํ๊ฒ ๋ฉ๋๋ค.
๊ทธ๋ฆผ์ ์์ธํ ๋ณด์๋ฉด, Subscriber๋ Publisher์๊ฒ ํผ๋๋ฐฑ์ ์ค๋๋ค.
๊ฐ๋จํ๊ฒ ์ค๋ช ํ์๋ฉด, ์ด ํผ๋๋ฐฑ์ ํผ์ก์ ์ ์ดํ ์ ์๋ ๋๊ตฌ๋ก "๋ชจ๋ ์ด๋ฒคํธ๋ฅผ ๋ค pushํ์ง ๋ง๊ณ , N๊ฐ๋ง ๋ณด๋ด์ค"์ ๊ฐ์ ์๊ตฌ์ ํด๋นํ๋ค๊ณ ํฉ๋๋ค. ์ด๋ก์จ Subscriber์ ๋ฐ์ดํฐ๊ฐ ์ง๋์น๊ฒ ์์ฌ์ ๊ฐ๋นํ ์ ์๋ ํ์์ ์ ๊ฑฐํ๊ธฐ ์ํด ์ด ํผ๋๋ฐฑ์ ๊ต์ฅํ ์ค์ํ ์ญํ ์ ํฉ๋๋ค.
์ด๋ฌํ ํผ๋๋ฐฑ์ ๊ด์ฅํ๋ ์์๊ฐ ๋ฐ๋ก Back-Pressure ์ ๋๋ค. ํ๊ตญ์ด๋ก๋ '๋ฐฐ์'์ด๋ผ๊ณ ํ๋ต๋๋ค.
๋ฐฑ๊ธฐ์ ๋์ ์ ํ๋ธ์์ ์ด Back-Pressure๋ ๊ต์ฅํ ์ค์ํ ํค์๋๋ผ๊ณ ํ์ง๋ง, ์๋ฃ์์ Back-Pressure์ ์ค๋ช ํ์ง ์์ ๊ฒ์ด ๊ต์ฅํ ๋ถ์คํ๋ค๊ณ ๋ง์์ ํ์ จ๋ค์. ๊ทธ๋์ ์ถ๊ฐ์ ์ธ ์๋ฃ๋ฅผ ์ฐพ์ ์ ๋ฆฌ๋ฅผ ํ์ต๋๋ค.
๋ฐฐ์์ ์ฌ์ ์ ์๋ฏธ๋ก ํ์ดํ๋ฅผ ํตํ ์ ์ฒด ํ๋ฆ์ ๋ฐํ๋ ์ ํญ, ํ์ ์๋ฏธํ๋ฉฐ ์ ์ฒด๊ฐ ํ๋ฅด๋ ๋ฐฉํฅ๊ณผ ๋ฐ๋ ๋ฐฉํฅ์ผ๋ก ์์ฉํ๋ ์ ํญ ์๋ ฅ์ ์๋ฏธํฉ๋๋ค.
๋๋์ฒด ์ด๊ฒ ์ํํธ์จ์ด ์๊ธฐ๋ฅผ ํ๋ค๊ฐ ์ ๋์ค๋๋? ๋ผ๋ ์๋ฌธ์ด ์์ ์ ์์ง๋ง, Reactive Streams๋ ์ค์ ์ธ์์ ์๋ ํ์ดํ์ ๊ทธ ํ๋ฆ์ ๋น๋์ด ์ค๊ณ๋ ๊ฒ์ ๋๋ค. ๋จ์ง ๊ทธ ๋ด์ฉ๋ฌผ์ด ์ก์ฒด์ ๊ธฐ์ฒด๊ฐ ์๋ ๋ฐ์ดํฐ๋ก ๋ฐ๋ ๊ฒ ๋ฟ์ด์ฃ . ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ด Reactive Streams์์๋ ๋ฐฐ์์ด ์กด์ฌํฉ๋๋ค.
๋ฐฐ์์ ํ์์ฑ์ ์๋ ๊ทธ๋ฆผ์ผ๋ก ์ฝ๊ฒ ์์๋ณผ ์ ์์ต๋๋ค.
๋ฐฐ์์ด ์ ์์ ์ผ๋ก ๋์ํ๋ค๋ฉด, ๋ชจ๋๊ฐ ์ผ์ ํ ์ฒ๋ฆฌ๋์ ์ ์งํ๋ฉด์ ์งํํฉ๋๋ค.
Fast Producer๊ฐ Slow Consumer์๊ฒ ์ ์ ํ ์๋๋ก ๋ฒฝ๋์ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ์ผ์ด ์ ์งํ๋ ์ ์์ต๋๋ค.
๋ฐ๋ฉด์ ๋ฐฐ์์ด ์๋ค๋ฉด, Fast Producer๋ Slow Consumer๋ฅผ ๊ณ ๋ คํ์ง ์๊ณ ๋ฌด์ง์ฑ ๋ฒฝ๋ ์ ์กํ๋ ๋ชจ์ต์ ๋ณผ ์ ์์ต๋๋ค.
Slow Consumer๋ ๊ฐ๋นํ์ง ๋ชปํ๊ณ ๋๋ง์ณ๋ฒ๋ฆฝ๋๋ค.
์ํํธ์จ์ด ํ๊ฒฝ์์๋ CPU์ ๋ฉ๋ชจ๋ฆฌ, Data Drop ํ์์ ๊ฒช์ ์ ์์ต๋๋ค. Network I/O, Disk I/O, Out of Memory ๋ฑ์ ํ์์ ๊ฒช์ ์๋ ์๊ณ ์.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ํ์์ ๋ง๊ธฐ ์ํ ๋ ธ๋ ฅ์ด ํ์ํ ๊ฒ์ ๋๋ค.
Reactor๋ ์ด๋ค ๋ฐ์ดํฐ๊ฐ ๋ํด์ ๊ฐ๊ฐ์ ๋จ๊ณ๋ฅผ ์ ์ฉํ๊ธฐ ์ํ ์ฒ๋ฆฌ์ ๋ํ ๋ด์ฉ์ ๊ธฐ์ ํ๊ธฐ ์ํด ์๋ก ๋ฌถ์ฌ์๋, ์คํผ๋ ์ดํฐ๋ผ๋ ๊ฐ๋ ์ ์ถ๊ฐํ์ต๋๋ค.
์คํผ๋ ์ดํฐ๋ฅผ ์ ์ฉํ๋ฉด, ์ค๊ฐ ํผ๋ธ๋ฆฌ์ (upstream์ ๋ํ subscriber, downstream์ ๋ํ publisher)๋ฅผ ๋ฆฌํดํ๊ฒ ๋ฉ๋๋ค.
Flux<String> flux = Flux.just("A");
flux.map(s -> "foo" + s); // ์๋ก์ด Publisher ์์ฑ, ๊ฑ๋ฅผ ๊ตฌ๋
ํด์ผ fooA๊ฐ ์ฐํ.
flux.subscribe(System.out::println); // ์๋ 1๋ฒ ๋ผ์ธ์ flux๋ฅผ ๊ตฌ๋
, ๋ฐ๋ผ์ "A"๊ฐ ๋์จ๋ค.
Flux<String> flux = Flux.just("A");
Flux<String> flux2 = flux.map(s -> "foo" + s);
flux2.subscribe(System.out::println); // fooA
๋ ๋ฒ์งธ ์ค์ ์ฝ๋๋ฅผ ๋ณด๋ฉด, flux.map()์ ํตํด์ ์๋ก์ด ์ค๊ฐ publisher๊ฐ ์์ฑ๋๊ฒ ๋ฉ๋๋ค.
ํ์ง๋ง ์ ์งธ ์ค์์ ์ฒซ์งธ ์ค์ flux๋ฅผ subscribe ํ๊ธฐ ๋๋ฌธ์ "fooA"๊ฐ ์๋ "A"๊ฐ ๋์ค๊ฒ ๋์ฃ .
๊ทธ ์๋์ ์ฝ๋๋๋ก ์ฌ์ฉํ๋ฉด, ๊ธฐ์กด์ ์๋๋๋ก ์ฝ๋๊ฐ ๋์ค๊ฒ ๋ฉ๋๋ค. ๋ฌผ๋ก flux2๋ฅผ ์์ฑํ์ง ์๊ณ ์ด์ด์ ์ ์ธํ ์๋ ์์ต๋๋ค.
๐ ์ถ์ฒ
[๋งํฌ] https://www.youtube.com/watch?v=VeSHa_Xsd2U&list=LL&index=2 (๋ฐฑ๊ธฐ์ ๋ ์ ํ๋ธ)
[๋งํฌ] https://tech.io/playgrounds/929/reactive-programming-with-reactor-3/Intro (Introduction to Reactive Programming)
[๋งํฌ] https://doublem.org/stream-backpressure-basic/ (back-pressure์ ๋ํ ์ดํด)
[๋งํฌ] https://www.oreilly.com/library/view/spring-50-projects/9781788390415/fd86b987-d9dd-465e-837f-ab4534e9d337.xhtml (TCK)