Spring/Spring WebFlux

Spring/Spring WebFlux

[๐Ÿ“• Reactive] Operators ไธญ

Sequence ๋ณ€ํ™˜ Operatorโœณ๏ธ mapupstream์—์„œ emit๋œ ๋ฐ์ดํ„ฐ๋ฅผ mapper function์„ ์‚ฌ์šฉํ•ด ๋ณ€ํ™˜ํ•œ ํ›„, downstream์œผ๋กœ emitmap() operator ๋‚ด๋ถ€์—์„œ ์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ sequence๊ฐ€ ์ข…๋ฃŒ๋˜์ง€ ์•Š๊ณ  ๊ณ„์† ์ง„ํ–‰๋˜๋„๋ก ํ•˜๋Š” ๊ธฐ๋Šฅ ์ง€์› Mono mono = Mono.just("Reactor") .map(String::toUpperCase);mono.subscribe(System.out::println); // ์ถœ๋ ฅ: REACTOR โœณ๏ธ flatMapupstream์—์„œ emit๋œ ๋ฐ์ดํ„ฐ๊ฐ€ Inner Sequence์—์„œ ํ‰ํƒ„ํ™” ์ž‘์—…์„ ๊ฑฐ์น˜๋ฉด์„œ ํ•˜๋‚˜์˜ Sequence๋กœ ๋ณ‘ํ•ฉ๋˜์–ด downstream์œผ๋กœ emitpublic class Example { public..

Spring/Spring WebFlux

[๐Ÿ“• Reactive] Spring WebFlux

Spring WebFlux ๊ฐœ์š”Spring 5.0๋ถ€ํ„ฐ ์ง€์›ํ•˜๋Š” ๋ฆฌ์•กํ‹ฐ๋ธŒ ์›น ํ”„๋ ˆ์ž„์›Œํฌ๋กœ, ์ ์€ ์ˆ˜์˜ ์Šค๋ ˆ๋“œ๋กœ ๋Œ€๋Ÿ‰์˜ ์š”์ฒญ์„ ์•ˆ์ •์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋น„๋™๊ธฐ Non-Blocking I/O ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ๋‹ค.     Spring WebFlux ๊ธฐ์ˆ  ์Šคํƒ โœณ๏ธ Spring MVC์™€ Spring WebFlux ๊ธฐ์ˆ  ์Šคํƒ ๋น„๊ต  ๐Ÿ”ท ์„œ๋ฒ„Spring MVC์„œ๋ธ”๋ฆฟ ๊ธฐ๋ฐ˜์˜ ํ”„๋ ˆ์ž„์›ŒํฌApache Tomcat๊ฐ™์€ ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ์—์„œ Blocking I/O ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘Spring WebFluxNon-Blocking I/O ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•˜๋Š” Netty ๋“ฑ์˜ ์„œ๋ฒ„ ์—”์ง„์—์„œ ๋™์ž‘ ๐Ÿ”ท ์„œ๋ฒ„ APISpring MVC์„œ๋ธ”๋ฆฟ API ์‚ฌ์šฉSpring WebFlux Jetty๋‚˜ Undertow ๊ฐ™์€ ์„œ๋ฒ„ ์—”์ง„์—์„œ ์ง€์›ํ•˜๋Š” ๋ฆฌ์•กํ‹ฐ๋ธŒ ์Šค..

Spring/Spring WebFlux

[๐Ÿ“• Reactive] Operators ไธŠ

Operator๋ž€ ?Reactive Stream์˜ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜ ๋ณ€ํ™˜ํ•˜๋Š” ์—ญํ• ์„ ํ•˜๋Š” ๋ฉ”์„œ๋“œ  ๐Ÿ”ท ํŠน์ง• ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์กฐํ•ฉ ๊ฐ€๋Šฅ์„ฑ์ง€์—ฐ ์‹คํ–‰ (๊ตฌ๋…์ด ํ˜ธ์ถœ๋˜์–ด์•ผ ์ฒ˜๋ฆฌ)๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ๋‹จ๊ณ„์ ์œผ๋กœ ์ฒ˜๋ฆฌ  Sequence ์ƒ์„ฑ์„ ์œ„ํ•œ Operatorโœณ๏ธ justOrEmptyjust()์˜ ํ™•์žฅ operator๋กœ์„œ, emitํ•  ๋ฐ์ดํ„ฐ๊ฐ€ null์ธ ๊ฒฝ์šฐ NullPooinException์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ณ , onComplete signal์„ ์ „์†กjust()๋Š” Reactor์—์„œ ๊ฐ„๋‹จํ•˜๊ณ  ์ •์ ์ธ ๋ฐ์ดํ„ฐ๋ฅผ Reactive Stream์œผ๋กœ ๋ณ€ํ™˜ํ•  ๋•Œ ์œ ์šฉ- Hot Publisher์ด๊ธฐ ๋•Œ๋ฌธ์— Subscriber์˜ ๊ตฌ๋… ์—ฌ๋ถ€์™€๋Š” ์ƒ๊ด€์—†์ด ๋ฐ์ดํ„ฐ๋ฅผ emit.- ๊ตฌ๋…์ด ๋ฐœ์ƒํ•˜๋ฉด emit๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ replayํ•ด์„œ Sub..

Spring/Spring WebFlux

[๐Ÿ“• Reactive] 6. Sinks์™€ Scheduler

Sinks ๋ž€ ?Reactor์—์„œ ์ œ๊ณตํ•˜๋Š” Sinks๋Š” ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๋ฐœํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ํ‹ธ๋ฆฌํ‹ฐ๋กœ, Publisher ๋ฐ Subscriber ์—ญํ• ์„ ์ง€์›ํ•œ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ generate() operator๋‚˜ create() operator๋Š” ์‹ฑ๊ธ€์Šค๋ ˆ๋“œ ๊ธฐ๋ฐ˜์—์„œ signal์„ ์ „์†กํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ˜๋ฉด, Sinks๋Š” ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ๋ฐฉ์‹์œผ๋กœ signal์„ ์ „์†กํ•ด๋„ ์Šค๋ ˆ๋“œ ์•ˆ์ „์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๋™์ž‘์œผ๋กœ ์ด์–ด์ง€๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ด์ค€๋‹ค. ๐Ÿ’ก์Šค๋ ˆ๋“œ ์•ˆ์ „์„ฑ์ด๋ž€ ? ํ•จ์ˆ˜๋‚˜ ๋ณ€์ˆ˜ ๊ฐ™์€ ๊ณต์œ  ์ž์›์— ๋™์‹œ ์ ‘๊ทผํ•  ๊ฒฝ์šฐ์—๋„ ํ”„๋กœ๊ทธ๋žจ์˜ ์‹คํ–‰์— ๋ฌธ์ œ๊ฐ€ ์—†์Œ์„ ์˜๋ฏธํ•œ๋‹ค.๋™์‹œ ์ ‘๊ทผ์„ ๊ฐ์ง€ํ•˜๊ณ , ๋™์‹œ ์ ‘๊ทผํ•˜๋Š” ์Šค๋ ˆ๋“œ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋น ๋ฅด๊ฒŒ ์‹คํŒจํ•จ์œผ๋กœ์จ ์Šค๋ ˆ๋“œ ์•ˆ์ „์„ฑ์„ ๋ณด์žฅํ•œ๋‹ค.    Sinks ์ข…๋ฅ˜ ๋ฐ ํŠน์ง• โœณ๏ธ Sink..

Spring/Spring WebFlux

[๐Ÿ“• Reactive] 5. Reactor

Reactor๋ž€ ? ๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ  Spring Framework ํŒ€์— ์˜ํ•ด ๊ฐœ๋ฐœ๋œ ๋ฆฌ์•กํ‹ฐ๋ธŒ ์ŠคํŠธ๋ฆผ์ฆˆ์˜ ๊ตฌํ˜„์ฒด๋กœ์„œ Spring WebFlux ๊ธฐ๋ฐ˜์˜ ๋ฆฌ์•กํ‹ฐ๋ธŒ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ œ์ž‘ํ•˜๊ธฐ ์œ„ํ•œ ํ•ต์‹ฌ ์—ญํ• ์„ ๋‹ด๋‹นํ•œ๋‹ค.โœณ๏ธ Reactor์˜ ํŠน์ง• Reactive StreamsNon-BlockingJava's Functional APIFlux[N]Mono[0|1]MicroservicesBackpressure  Mono ๊ธฐ๋ณธ ์˜ˆ์ œpublic class Example { public static void main(String[] args) { Mono .empty() .subscribe( none -> System.out.println(..

Spring/Spring WebFlux

[๐Ÿ“• Reactive] 4. Reactive ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์œ„ํ•œ ์‚ฌ์ „ ์ง€์‹

1. ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค๋‹จ ํ•˜๋‚˜์˜ ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋งŒ ์žˆ๋Š” ์ •์˜๋˜์–ด์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค (Java 8๋ถ€ํ„ฐ ์ง€์› ๊ฐ€๋Šฅ)ํ•จ์ˆ˜๋ฅผ ๊ฐ’์œผ๋กœ ์ทจ๊ธ‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋–ค ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ํ•จ์ˆ˜ ์ž์ฒด๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ ๊ฐ€๋Šฅpublic class Example { public static void main(String[] args){ List cryptoCurrencies = SampleData.cryptoCurrencies; Collections.sort(cryptoCurrencies, new Comparator() { @Override public int compare(CryptoCurrency cc1, CryptoCurrency cc2) { r..

Spring/Spring WebFlux

[๐Ÿ“• Reactive] 3. Blocking I/O์™€ Non-Blocking I/O

1. Blocking I/Oํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๊ฐ€ I/O์— ์˜ํ•ด์„œ ์ฐจ๋‹จ๋˜์–ด ๋Œ€๊ธฐํ•˜๋Š” ๊ฒƒ  ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ ๊ธฐ๋ฒ•์œผ๋กœ ์ถ”๊ฐ€ ์Šค๋ ˆ๋“œ๋ฅผ ํ• ๋‹นํ•˜์—ฌ ์ฐจ๋‹จ๋œ ๊ทธ ์‹œ๊ฐ„์„ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜๋Š” ์žˆ์œผ๋‚˜, ์—ฌ๋Ÿฌ ๋ฌธ์ œ ๋ฐœ์ƒ ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ์œผ๋กœ ์ธํ•œ ์Šค๋ ˆ๋“œ ์ „ํ™˜ ๋น„์šฉ๊ณผ๋‹คํ•œ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์œผ๋กœ ์˜ค๋ฒ„ํ—ค๋“œ ๋ฐœ์ƒ ๊ฐ€๋Šฅ ์ƒˆ๋กœ์šด ์Šค๋ ˆ๋“œ๊ฐ€ ์‹คํ–‰๋˜๋ฉด JVM์—์„œ๋Š” ํ•ด๋‹น ์Šค๋ ˆ๋“œ๋ฅผ ์œ„ํ•œ ์Šคํƒ ์˜์—ญ์˜ ์ผ๋ถ€ ํ• ๋‹นํ•˜๋ฉฐ, ์ƒˆ๋กœ์šด ์Šค๋ ˆ๋“œ ์ •๋ณด๋Š” ์Šคํƒ ์˜์—ญ์— ๊ฐœ๋ณ„ ํ”„๋ ˆ์ž„ ํ˜•ํƒœ๋กœ ์ €์žฅ๋จ ๐Ÿ‘‰ ๊ฐ๊ฐ์˜ ์Šค๋ ˆ๋“œ ๋‚ด๋ถ€์—์„œ ๋˜ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€๋กœ ํ• ๋‹นํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ๊ฐ๋‹นํ•˜๊ธฐ ํž˜๋“ค ์ •๋„๋กœ ๋Š˜์–ด๋‚จ์Šค๋ ˆ๋“œ ํ’€์—์„œ ์‘๋‹ต์ง€์—ฐ ๋ฐœ์ƒ์ผ์ • ๊ฐœ์ˆ˜์˜ ์Šค๋ ˆ๋“œ๋ฅผ ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•ด์„œ ํ’€์— ์ €์žฅํ•ด ๋‘๊ณ  ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ํ’€์—์„œ ๊บผ๋‚ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‚˜, ์œ ํ›„ ์Šค๋ ˆ๋“œ๊ฐ€ ์—†๋‹ค๋ฉด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ..

Spring/Spring WebFlux

[๐Ÿ“• Reactive] 2. Reactive Streams

1. ๋ฆฌ์•กํ‹ฐ๋ธŒ ์ŠคํŠธ๋ฆผ์ฆˆ๋ž€ ? ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ์„ Non-Blocking์ด๋ฉด์„œ ๋น„๋™๊ธฐ์ ์ธ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋ฆฌ์•กํ‹ฐ๋ธŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํ‘œ์ค€ ์‚ฌ์–‘ โœณ๏ธ publisher์™€ subscriber ๊ฐ„์— ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ๋™์ž‘ ๊ณผ์ • subscriber๋Š” ์ „๋‹ฌ๋ฐ›์„ ๋ฐ์ดํ„ฐ ๊ตฌ๋… (subscribe)publisher๋Š” ๋ฐ์ดํ„ฐ ํ†ต์ง€ํ•  ์ค€๋น„๋˜์—ˆ์Œ์„ subscriber์— ์•Œ๋ฆผ (onSubscribe)publisher๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ํ†ต์ง€ํ•  ์ค€๋น„๊ฐ€ ๋˜์—ˆ๋‹ค๋Š” ์•Œ๋ฆผ์„ ๋ฐ›์€ subscriber๋Š” ์ „๋‹ฌ๋ฐ›๊ธฐ๋ฅผ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜๋ฅผ publisher์—๊ฒŒ ์š”์ฒญ (Subscription.request)publisher๋Š” subscriber๋กœ๋ถ€ํ„ฐ ์š”์ฒญ๋ฐ›์€ ๋งŒํผ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ†ต์ง€ํ•จ (onNext)publisher์™€ subscriber ๊ฐ„์— ๋ฐ์ดํ„ฐ ํ†ต์ง€, ๋ฐ์ด..

soogoori
'Spring/Spring WebFlux' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ธ€ ๋ชฉ๋ก