Spring/Spring WebFlux

Spring/Spring WebFlux

[๐Ÿ“• Reactive] 1. Reactive ์‹œ์Šคํ…œ๊ณผ Reactive ํ”„๋กœ๊ทธ๋ž˜๋ฐ

Reactor, Spring WebFlux์˜ ๊ธฐ์ดˆ ๊ฐœ๋…์„ ๊ผผ๊ผผํ•˜๊ฒŒ ๋‹ค์ง€๊ณ ์ž "์Šคํ”„๋ง์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ" ์ฑ…์„ ์ •๋…ํ•˜๊ณ  ์ •๋ฆฌํ•˜๋ ค๊ณ  ํ•œ๋‹ค.   1. ๋ฆฌ์•กํ‹ฐ๋ธŒ ์‹œ์Šคํ…œ์ด๋ž€?๋ฆฌ์•กํ‹ฐ๋ธŒ ์‹œ์Šคํ…œ = ๋ฐ˜์‘์„ ์ž˜ํ•˜๋Š” ์‹œ์Šคํ…œ  ๐Ÿ‘‰ ๋น„๋™๊ธฐ ๋ฉ”์‹œ์ง€ ๊ธฐ๋ฐ˜์˜ ํ†ต์‹ ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์— ์ฆ‰๊ฐ์ ์œผ๋กœ ์‘๋‹ตํ•จ์œผ๋กœ์จ ์ง€์—ฐ ์‹œ๊ฐ„์„ ์ตœ์†Œํ™”ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธโœณ๏ธ ํŠน์ง•์„ ์–ธํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์‹คํ–‰ํ•  ๋™์ž‘์„ ๊ตฌ์ฒด์ ์œผ๋กœ ๋ช…์‹œํ•˜์ง€ ์•Š๊ณ , ๋ชฉํ‘œ๋งŒ ์„ ์–ธ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋™์ž‘์„ ๊ฐ๊ฐ ๋ณ„๋„์˜ ์ฝ”๋“œ๋กœ ๋ถ„๋ฆฌํ•˜์ง€ ์•Š๊ณ , ๊ฐ ๋™์ž‘์— ๋Œ€ํ•ด์„œ ๋ฉ”์„œ๋“œ ์ฒด์ธ์„ ํ˜•์„ฑํ•ด ํ•œ ๋ฌธ์žฅ์œผ๋กœ ๋œ ์ฝ”๋“œ๋กœ ๊ตฌ์„ฑData streams์™€ propagation of change๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค ์ด๊ฒƒ์„ ๋ณ€ํ™”ํ•˜๋Š” ์ด๋ฒคํŠธ๋กœ ๋ด„์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒํ‚ค๋ฉด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ„์†์ ์œผ๋กœ ์ „๋‹ฌ  ๐Ÿ”ท ๋ช…๋ นํ˜• ํ”„๋กœ..

Spring/Spring WebFlux

[WebFlux] Reactor ์—ฐ์‚ฐ์ž ์ •๋ฆฌ

flatMapManyflatMapManyMono์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ ์š”์†Œ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์‚ฌ์šฉ ๐Ÿ‘‰ Mono์—์„œ ๋ฐ˜ํ™˜๋œ ๊ฒฐ๊ณผ๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์š”์†Œ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ Flux๋กœ ์ฒ˜๋ฆฌํ•  ๋•Œ ์œ ์šฉ   fromIterableIterable ํƒ€์ž…์˜ ๋ฐ์ดํ„ฐ(list, set, map ๋“ฑ์˜ ์ปฌ๋ ‰์…˜)๋ฅผ Flux๋กœ ๋ณ€ํ™˜ ๐Ÿ‘‰ ์ปฌ๋ ‰์…˜ ๋‚ด์˜ ์š”์†Œ๋“ค์„ ๋ฆฌ์•กํ‹ฐ๋ธŒ ์ŠคํŠธ๋ฆผ์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌ  map, mapNotNullmap์€ onNext ์ด๋ฒคํŠธ๋ฅผ ๋ฐ›์•„์„œ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๊ณ  ์•„๋ž˜๋กœ ์ „๋‹ฌ Flux.range(1, 5) .map(value -> value * 2) .doOnNext(value -> { log.info("doOnNext: " + value); }) .subscribe();โ€‹mapNotNull์€ ๋ณ€๊ฒฝ๋œ ๊ฐ’์ด nu..

Spring/Spring WebFlux

[WebFlux] flatMap๊ณผ map์˜ ์ฐจ์ด

Webflux๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋งˆ๋‹ค flatMap๊ณผ map์ด ํ•ญ์ƒ ํ—ท๊ฐˆ๋ฆฌ๋ฏ€๋กœ ์ •๋ฆฌ. ๋‘ ๋ฉ”์„œ๋“œ๋Š” Reactive Stream API ์ผ๋ถ€๋กœ Reactor ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ Mono์™€ Flux์—์„œ ์‚ฌ์šฉ๋˜๋ฉฐ ๋น„๋™๊ธฐ ์ŠคํŠธ๋ฆผ ์ฒ˜๋ฆฌ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. ๋‹จ, flatMap์ด ๋น„๋™๊ธฐ ์ž‘์—…์— ๋” ์ ํ•ฉ !  flatMap()์ž…๋ ฅ ์ŠคํŠธ๋ฆผ์˜ ๊ฐ ์š”์†Œ์— ๋Œ€ํ•ด ๋น„๋™๊ธฐ์ ์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ์ ์šฉ ๐Ÿ‘‰ 1:N ๋ณ€ํ™˜์›๋ณธ ์š”์†Œ๋ฅผ ๋ณ€ํ™˜ํ•˜์—ฌ ์ƒˆ๋กœ์šด Mono ๋˜๋Š” Flux ๋ฐ˜ํ™˜๋ฐ˜ํ™˜๋œ ์ŠคํŠธ๋ฆผ์€ flatten(ํ‰ํƒ„ํ™”)๋˜์–ด ๋‹จ์ผ Mono ๋˜๋Š” Flux๋กœ ํ•ฉ์ณ์ง@GetMapping("/user/{id}")public Mono getUser(@PathVariable String id) { return userRepository.findById(id) // ret..

Spring/Spring WebFlux

[WebFlux] Reactive Streams

Reactive Programmingโœณ๏ธ ์ „ํ†ต์ ์ธ ์ฝœ๋ฐฑ ๊ธฐ๋ฐ˜ API๋‚˜ Future์™€ ๊ฐ™์€ JDK์˜ ๋น„๋™๊ธฐ ์ฝ”๋“œ ์ž‘์„ฑ ๋ฐฉ์‹์— ๋น„ํ•ด ๋” ์œ ์—ฐํ•˜๊ณ  ํšจ์œจ์ 1. ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์˜ ๊ฐ„์†Œํ™” : ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ŠคํŠธ๋ฆผ์˜ ํ˜•ํƒœ๋กœ ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ ๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„์„ ํ†ตํ•ด ๊ฐ ๋‹จ๊ณ„๋ฅผ ์—ฐ๊ฒฐํ•˜๊ณ  ๋ฐ์ดํ„ฐ๊ฐ€ ์ค€๋น„๋˜๋Š” ์ฆ‰์‹œ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ2. ์„ ์–ธ์  API ์ œ๊ณต : Reactor, RxJava์™€ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” map, filter, reduce์™€ ๊ฐ™์€ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์Šคํƒ€์ผ์˜ ์—ฐ์‚ฐ์ž๋ฅผ ์ œ๊ณตํ•˜์—ฌ ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜ํ•˜๊ณ  ์กฐ์ž‘ํ•˜๋Š” ๊ณผ์ •์„ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ํ‘œํ˜„3. backPressure ์ง€์› : ๋ฐ์ดํ„ฐ ์†Œ๋น„์ž๊ฐ€ ๋ฐ์ดํ„ฐ ์ƒ์‚ฐ์ž์˜ ์†๋„๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•จ 4. ๋ณต์žก์„ฑ ๊ฐ์†Œ์™€ ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ : ์—ฐ์‚ฐ์ž ์ฒด์ด๋‹์„ ํ†ตํ•ด ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ ๋†’์ด๊ณ  ๊ฐ ๋‹จ๊ณ„์˜ ์ž‘์—…์„ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ฐœ๋ฐœ์ž๊ฐ€..

Spring/Spring WebFlux

[WebFlux] ๋น„๋™๊ธฐ/๋™๊ธฐ, non-blocking/blocking, CompletableFuture

ํŒ€์—์„œ IoT๋ฅผ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด WebFlux๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค.WebFlux์— ๋Œ€ํ•ด ์–•๊ฒŒ๋งŒ ์•Œ๊ณ  ์‚ฌ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฒˆ ๊ธฐํšŒ์— ๊ณต๋ถ€ํ•ด๋ณด๊ธฐ๋กœ ํ•œ๋‹ค.  โœด๏ธ Sync(๋™๊ธฐ)์™€ Async(๋น„๋™๊ธฐ)๐Ÿ”ถ Sync : ํด๋ผ์ด์–ธํŠธ์—์„œ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ → ๋ฉ”์„œ๋“œ ์ œ๊ณตํ•˜๋Š” ๊ณณ์—์„œ ๊ธฐ๋Šฅ์„ ๋ชจ๋‘ ์ˆ˜ํ–‰ํ•ด ๊ฒฐ๊ณผ๊ฐ’์ด ๊ฒฐ์ •๋˜๋ฉด ๊ทธ๋•Œ ๋ฐ˜ํ™˜ ๐Ÿ‘‰ ์š”์ฒญํ•œ ์ž‘์—…์— ๋Œ€ํ•ด ์™„๋ฃŒ ์—ฌ๋ถ€๋ฅผ ์‹ ๊ฒฝ ์จ์„œ ์ž‘์—…์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ• ์ง€ ์•„๋‹Œ์ง€ ๊ฒฐ์ •๐Ÿ”ถ Async : ๊ฒฐ๊ณผ๊ฐ’์ด ๊ฒฐ์ •๋˜๊ธฐ ์ „์— ์ผ๋‹จ ๋ฐ˜ํ™˜ (์ˆœ์„œ ๋ณด์žฅ X)๐Ÿ‘‰ ์š”์ฒญํ•œ ์ž‘์—…์— ๋Œ€ํ•ด ์™„๋ฃŒ ์—ฌ๋ถ€๋ฅผ ๋”ฐ์ง€์ง€ ์•Š๊ณ  ์ž์‹ ์˜ ๋‹ค์Œ ์ž‘์—…์„ ๊ทธ๋Œ€๋กœ ์ˆ˜ํ–‰ โœด๏ธ Blocking๊ณผ Non-Blocking๐Ÿ”ท Blocking : ์š”์ฒญํ•œ ์ž‘์—…์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ๋‹ค๋ฅธ ์ž‘์—…ํ•˜์ง€ ์•Š๊ณ  ๊ธฐ๋‹ค๋ฆผ๐Ÿ”ท Non-Blocking : ์š”..

Spring/Spring WebFlux

[WebFlux] Spring WebFlux๋ž€?

Spring WebFlux๋Š” Reactive Stream API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ non-blocking, asynchronous๋ฅผ ์ง€์›ํ•˜๋Š” ๋น„๋™๊ธฐ ์Šคํ”„๋ง ์›น ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค. ์ด๋Š” ๋Œ€๋Ÿ‰์˜ ์›น ํŠธ๋ž˜ํ”ฝ (I/O๊ฐ€ ๋งŽ์€ ์›น ์„œ๋น„์Šค ๋กœ์ง)์—์„œ MVC์™€ ๋Œ€๋น„ํ•˜์—ฌ ํšจ์œจ์ ์ด๊ณ  ๋†’์€ ์„ฑ๋Šฅ์„ ๋ณด์—ฌ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ํ™œ์šฉ๋˜๊ณ  ์žˆ๋‹ค. ๋งค๋ฒˆ WebFlux์˜ ์„ฑ๋Šฅ์ด ์ข‹๋‹ค๊ณ ๋Š” ํ•  ์ˆ˜ ์—†์Œ!๋”๋ณด๊ธฐ๐Ÿ‘‰ ๊ทธ๋Ÿฌ๋ฉด ์ฃผ๋กœ ์–ด๋””์—์„œ ํ™œ์šฉ๋˜๋‚˜...?๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค์—์„œ ๋‹ค์–‘ํ•œ ๋™์‹œ ์š”์ฒญ์„ ์ˆ˜ํ–‰ํ•˜๋Š” gateway server์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆฌ๋ฐ์„ ์œ„ํ•œ ์›น์†Œ์ผ“๋Œ€๋Ÿ‰์˜ I/O๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ… ์„œ๋น„์Šค    Spring MVC vs Spring WebFluxSpring ๊ณต์‹ ํŽ˜์ด์ง€์— ๋‚˜์™€์žˆ๋Š” ํ‘œ๋ฅผ ํ†ตํ•ด ๋‘˜์˜ ์ฐจ์ด์ ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.WebFlux๋Š” ๋น„๋™๊ธฐ/๋…ผ๋ธ”๋กœํ‚น์ด..

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