Spring WebFlux

Spring WebFlux๋Š” Spring Framework 5๋ถ€ํ„ฐ ๋„์ž…๋œ ๋ฐ˜์‘ํ˜•(Reactive) ์›น ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค.

  • ๊ธฐ์กด์˜ Spring Web MVC์™€ ๋™์ผํ•œ ์—ญํ• ์„ ํ•˜์ง€๋งŒ, ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋‚ด๋ถ€ ๋™์ž‘ ๋ฐฉ์‹์˜ ์ฐจ์ด๊ฐ€ ์กด์žฌ

  • WebFlux๋Š” ๋น„๋™๊ธฐ ๋…ผ๋ธ”๋กœํ‚น(Asynchronous Non-Blocking) ๋ฐฉ์‹์„ ๊ธฐ๋ฐ˜ ์ˆ˜ํ–‰

    • ์ ์€ ์ˆ˜์˜ ์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ๋†’์€ ๋™์‹œ์„ฑ(Concurrency)๊ณผ ํ™•์žฅ์„ฑ(Scalability)์„ ๋ชฉํ‘œ๋กœ ์„ค๊ณ„

Spring WebFlux vs. Spring Web MVC

์ „ํ†ต์ ์ธ MVC์™€ ๊ฐ€์žฅ ํฐ ์ฐจ์ด์ ์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ชจ๋ธ๊ณผ ์Šค๋ ˆ๋“œ ๋ชจ๋ธ์— ์žˆ๋‹ค.

  • Spring Web MVC

    • ๋™์ž‘ ๋ฐฉ์‹: ๋ช…๋ นํ˜•(Imperative) ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ ๋ธ”๋กœํ‚น(Blocking) I/O ๊ธฐ๋ฐ˜

    • ์Šค๋ ˆ๋“œ ๋ชจ๋ธ: ์š”์ฒญ ํ•˜๋‚˜๋‹น ์Šค๋ ˆ๋“œ ํ•˜๋‚˜๋ฅผ ํ• ๋‹นํ•˜๋Š” Thread-per-Request ๋ชจ๋ธ์„ ์‚ฌ์šฉ

      • ์š”์ฒญ์ด ๋งŽ์•„์ง€๋ฉด ์Šค๋ ˆ๋“œ ์ˆ˜๋„ ๊ทธ๋งŒํผ ์ฆ๊ฐ€ํ•˜์—ฌ ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ(Context Switching) ๋น„์šฉ ์ฆ๊ฐ€

    • ๊ธฐ๋ฐ˜ ๊ธฐ์ˆ : Servlet API ์œ„์—์„œ ๋™์ž‘ํ•˜๋ฉฐ, Tomcat, Jetty ๊ฐ™์€ ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์ฃผ๋กœ ์‹คํ–‰

  • Spring WebFlux

    • ๋™์ž‘ ๋ฐฉ์‹: ๋ฐ˜์‘ํ˜•(Reactive) ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ ๋…ผ๋ธ”๋กœํ‚น(Non-Blocking) I/O ๊ธฐ๋ฐ˜

    • ์Šค๋ ˆ๋“œ ๋ชจ๋ธ: ์ ์€ ์ˆ˜์˜ ๊ณ ์ •๋œ ์Šค๋ ˆ๋“œ(๋ณดํ†ต CPU ์ฝ”์–ด ์ˆ˜์™€ ๋™์ผ)๋กœ ๋ชจ๋“  ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์ด๋ฒคํŠธ ๋ฃจํ”„(Event Loop) ๋ชจ๋ธ์„ ์‚ฌ์šฉ

      • I/O ์ž‘์—… ๋™์•ˆ ์Šค๋ ˆ๋“œ๊ฐ€ ๋Œ€๊ธฐํ•˜์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ ์ž์› ํšจ์œจ์„ฑ ๊ทน๋Œ€ํ™”

    • ๊ธฐ๋ฐ˜ ๊ธฐ์ˆ : Reactive Streams ๋ช…์„ธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ฉฐ, Netty์™€ ๊ฐ™์€ ๋น„๋™๊ธฐ ๋…ผ๋ธ”๋กœํ‚น ์„œ๋ฒ„์—์„œ ์ฃผ๋กœ ์‹คํ–‰

๊ตฌ๋ถ„
Spring Web MVC
Spring WebFlux

ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ชจ๋ธ

๋ช…๋ นํ˜• (Imperative)

๋ฐ˜์‘ํ˜•(Reactive)

I/O ๋ชจ๋ธ

๋ธ”๋กœํ‚น (Blocking)

๋…ผ๋ธ”๋กœํ‚น(Non-Blocking)

์Šค๋ ˆ๋“œ ๋ชจ๋ธ

์š”์ฒญ๋‹น ์Šค๋ ˆ๋“œ 1๊ฐœ

์ด๋ฒคํŠธ ๋ฃจํ”„(์ ์€ ์ˆ˜์˜ ์Šค๋ ˆ๋“œ)

ํ•ต์‹ฌ ์˜์กด์„ฑ

Servlet API

Reactive Streams API

๊ธฐ๋ณธ ๋‚ด์žฅ ์„œ๋ฒ„

Tomcat

Netty

์ฃผ์š” ์‚ฌ์šฉ ์‚ฌ๋ก€

์ผ๋ฐ˜์ ์ธ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜, CRUD API

๊ณ ์„ฑ๋Šฅ API Gateway, ์ŠคํŠธ๋ฆฌ๋ฐ ์„œ๋น„์Šค

ํ•ต์‹ฌ ๊ตฌ์„ฑ ์š”์†Œ ๋ฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ชจ๋ธ

Spring WebFlux๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋‘ ๊ฐ€์ง€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ชจ๋ธ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•œ๋‹ค.

1. Annotation-based ๋ฐฉ์‹(@Controller)

Spring Web MVC์™€ ๋งค์šฐ ์œ ์‚ฌํ•œ ๋ฐฉ์‹์œผ๋กœ, @Controller, @RestController, @RequestMapping ๋“ฑ์˜ ์–ด๋…ธํ…Œ์ด์…˜์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

๊ฐ€์žฅ ํฐ ์ฐจ์ด์ ์€ ๋ฐ˜ํ™˜ ํƒ€์ž…์œผ๋กœ Mono๋‚˜ Flux์™€ ๊ฐ™์€ ๋ฐ˜์‘ํ˜• ํƒ€์ž…(Publisher)์„ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์ ์ด๋‹ค.

  • WebFlux๋Š” ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋ฐ˜ํ™˜ํ•œ Publisher๋ฅผ ๊ตฌ๋…(subscribe)ํ•˜๊ณ , ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ์ด ์‹œ์ž‘๋˜๋ฉด ๋น„๋™๊ธฐ์ ์œผ๋กœ HTTP ์‘๋‹ต์„ ์ฒ˜๋ฆฌ

  • ์ปจํŠธ๋กค๋Ÿฌ ๋ฉ”์„œ๋“œ๋Š” ์‹ค์ œ ๋ฐ์ดํ„ฐ๊ฐ€ ์•„๋‹Œ ๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„์„ ์ •์˜ํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•˜์—ฌ, ์Šค๋ ˆ๋“œ๊ฐ€ ๋ธ”๋กœํ‚น๋˜์ง€ ์•Š์Œ

2. Functional ๋ฐฉ์‹(RouterFunctions)

์–ด๋…ธํ…Œ์ด์…˜ ๋Œ€์‹  ๋ผ์šฐํ„ฐ ํ•จ์ˆ˜(Router Function)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์š”์ฒญ ๊ฒฝ๋กœ์™€ ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜๋ฅผ ์ง์ ‘ ๋งคํ•‘ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.


WebFlux ์„ ํƒ ๊ธฐ์ค€

Spring Web MVC๋Š” ์—ฌ์ „ํžˆ ๋Œ€๋ถ€๋ถ„์˜ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ํ›Œ๋ฅญํ•˜๊ณ  ๋‹จ์ˆœํ•œ ์„ ํƒ์ง€์ด๋ฉฐ, WebFlux๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์— ํŠนํžˆ ์œ ์šฉํ•˜๋‹ค.

  • ๋†’์€ ๋™์‹œ์„ฑ ์ฒ˜๋ฆฌ: ์ˆ˜๋งŒ์—์„œ ์ˆ˜์‹ญ๋งŒ ๊ฐœ์˜ ๋™์‹œ ์—ฐ๊ฒฐ์„ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ(์˜ˆ: ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ…, ์ŠคํŠธ๋ฆฌ๋ฐ ์„œ๋น„์Šค, API Gateway)

  • ๋ฆฌ์•กํ‹ฐ๋ธŒ ์‹œ์Šคํ…œ ์—ฐ๋™: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(R2DBC), ๋‹ค๋ฅธ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ๋“ฑ ํ˜ธ์ถœํ•˜๋Š” ์‹œ์Šคํ…œ์ด ์ด๋ฏธ ๋ฐ˜์‘ํ˜•์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ

  • ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ: ํ•จ์ˆ˜ํ˜• ๋ผ์šฐํŒ… ๋ชจ๋ธ์„ ํ†ตํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ์ง์„ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•˜๋Š” ๊ฒฝ์šฐ

Last updated

Was this helpful?