์ค๋์ TIL ์ฃผ์ ๋ ๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ์ด๋ค.
๊ฐ๋ฐ์ ๋ชจ์์์ Spring WebFlux์ ๋ํ ์ด์ผ๊ธฐ๊ฐ ๋์์๊ณ , ๊ฐ์๋ฅผ ๋ค์ผ๋ฉด์ ์ด ๊ธฐ์ ์ ๋ํด ํ๋ฒ ๋ ๋ค์๋ค. ๊ทธ๋ฆฌ๊ณ ํ์ฌ ํ๊ฒฌ์จ ํ์ฌ์์ ์ด ๊ธฐ์ ์ ์ฐ๋ ๊ฒ์ ๋ณด๊ณ , 3๋ฒ์ด๋ ๋ง์ฃผ์ณค์ผ๋ ๊ทธ๋ผ ๋ด๊ฐ ์ง์ ๊ณต๋ถํด๋ณด์. ๋ผ๋ ์๊ฐ์ ํ๊ฒ ๋์๋ค.
๋ชจ๋ฅด๋ ๊ฒ์ ๋ฐฉ๋ํ๋ฐ ๋ชจ๋ ๊ฒ์ ๋ค ๊ณต๋ถํ ์๋ ์์ผ๋, 3๋ฒ ์ ๋ ๋ฃ๊ณ ๋ณด๊ฒ ๋๋ฉด ๊ทธ๋๋ ๊ณต๋ถ๋ฅผ ์์ํ์, ๋ ์ ํ๋ธ๋ฅผ ๋ณธ ์ ์ด ์๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋ฐ๋ฐ ์ด Spring WebFlux๋ ๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ค์ด์ง ์น ํ๋ ์์ํฌ์ด๊ธฐ ๋๋ฌธ์ ๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ์ ๋ํด ๋จผ์ ์ดํดํ ํ์๊ฐ ์๋ค๊ณ ์๊ฐํ๋ค.
๋น๋๊ธฐ์ ์ด๊ณ ์ด๋ฒคํธ ๊ธฐ๋ฐ์ ๋ฐ์ดํฐ ํ๋ฆ์ ์ฒ๋ฆฌํ๋ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์์ด๋ค.
์ฐจ๋ก๋๋ก ๋๊ธฐ๋ก ์ฒ๋ฆฌํ์ง ์๊ณ , ์ด๋ฒคํธ ์ฑ์ผ๋ก ๋ฐ์ํ๋ ๋ฐ์ดํฐ์ ํ๋ฆ(Flow)๊ณผ ๋ณํ์ ๋ฐ์(Reactive)ํ๋ ์์คํ
์ ๋ง๋๋ ๊ฒ์ ์ด์ ์ด ๋ง์ถฐ์ ธ ์๋ค.
๊ทธ๋ฌ๋๊น ์์คํ
๋ด์์ ์ผ์ด๋๋ ์ด๋ฒคํธ๋ ๋ฐ์ดํฐ์ ๋ณํ์ ๋ฐ์ํ๋ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ๋ค.
๋จผ์ ๋ช๊ฐ์ง ์ค์ํ ๊ฐ๋ ์ ์ ๋ฆฌํด๋ณด์
๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์์๋
๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ์ ๋น๋๊ธฐ์ ์ฒ๋ฆฌ๋ฅผ ๋ ์ง๊ด์ ์ด๊ณ ์ ์ธ์ ์ผ๋ก ๋ค๋ฃฐ ์ ์๋๋ก ๋์์ค๋ค.
๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ์์ ์ค์ํ ์ ์ ๋ฐ์ดํฐ๊ฐ ํ๋ฅธ๋ค๋ ์ ์ด๋ค.
๋ฐ์ดํฐ๋ฅผ ํ๋ํ๋ ์ฒ๋ฆฌํ๋ ๊ฒ์์ ๋ฒ์ด๋ โ ๋ฐ์ดํฐ ํ๋ฆ์ ์ ์ํ๊ณ ๊ทธ ํ๋ฆ์ ๋ฐ์ํ๋ ๋ฐฉ์์ ์ฌ์ฉํ๋ค.
์๋ฅผ ๋ค์ด, ์ฌ์ฉ์ UI์์ ๋ฐ์ดํฐ๋ฅผ ์ค์๊ฐ์ผ๋ก ์ฒ๋ฆฌํ ๋, ์๋ก์ด ๋ฐ์ดํฐ๊ฐ ๋ค์ด์ค๋ฉด ์๋์ผ๋ก UI๊ฐ ๊ฐฑ์ ๋๋ ๊ตฌ์กฐ๋ฅผ ์๊ฐํด๋ณผ ์ ์๋ค.
๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ์์๋ Publisher์ Subscriber ๊ฐ๋ ์ ์ฌ์ฉํ๋ค.
์ด ๊ตฌ์กฐ๋ ์ต์ ๋ฒ ํจํด(Observer Pattern)์ด๋ค. ๋ฐ์ดํฐ๊ฐ ๋ณํ๋ ๊ฒ์ ๊ด์ฐฐํ๊ณ ์๋ค๊ฐ, Publisher๋ ๋ณ๊ฒฝ์ฌํญ์ ๊ตฌ๋ ์์๊ฒ ์ ๋ฌํ๋ค. ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ๋ ์ธก๊ณผ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ ์ธก์ด ๋ถ๋ฆฌ๋์ด ์์ผ๋ฉฐ, ๊ตฌ๋ ์๋ ๋ฐ์ดํฐ๊ฐ ๋ณํ ๋๋ง๋ค ์๋ฆผ์ ๋ฐ์ ์ ์๋ค.
๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ์ ํต์ฌ์ ๋ฆฌ์กํฐ๋ธ ์คํธ๋ฆผ์ด๋ผ๋ ๊ฐ๋ ์ ์๋ค.
๋ฆฌ์กํฐ๋ธ ์คํธ๋ฆผ = ๋น๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌ๋๋ ๋ฐ์ดํฐ ํ๋ฆ์ ์๋ฏธ. ๋ฐ์ดํฐ ํ๋ฆ๊ณผ ๋ณ๊ฒฝ ์ฌํญ์ ๋ฐ์ํ๋ ๋ฐฉ์์ผ๋ก ๋์ํจ.
์ฃผ์ ํน์ง
๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ์ ๊ตฌํํ๋๋ฐ ์ฌ์ฉํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก Project Reactor๊ฐ ์๋๋ฐ ์ฌ๊ธฐ์ Flux์ Mono๋ผ๋ ๋๊ฐ์ง ์ฃผ์ ํ์ ์ ์ ๊ณตํ๋ค.
๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ์์๋ ์ฐ์ฐ์๋ฅผ ํตํด ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ๋ณํํ๊ฑฐ๋ ์ฒ๋ฆฌํ ์ ์๋ค.
import reactor.core.publisher.Flux;
public class ReactiveExample {
public static void main(String[] args) {
// Flux๋ฅผ ์ด์ฉํด ๋น๋๊ธฐ ๋ฐ์ดํฐ ์คํธ๋ฆผ ์์ฑ
Flux<Integer> numbers = Flux.just(1, 2, 3, 4, 5);
// ๊ฐ ๊ฐ์ 2๋ฐฐ๋ก ๋ณํํ์ฌ ์ถ๋ ฅ
numbers.map(n -> n * 2)
.subscribe(n -> System.out.println("Number: " + n));
}
}
์ด๋ฐ ์ฐ์ฐ์๋ฅผ ์กฐํฉํด์ ๋ค์ํ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์์ ์ ๋น๋๊ธฐ์ ์ผ๋ก ์ํํ ์ ์๋ค.
๋ฐ์ํ ์ ์๊ธฐ ๋๋ฌธ์ ์์คํ
์ด ์ ์ฐํ๊ณ ํ์ฅ์ฑ์ด ๋๋ค.