Backend/spring

web vs webflux

dddzr 2025. 2. 23. 18:10

๐Ÿ“Œ Spring Boot์™€ ๊ฐ Starter(web, webflux)์˜ ์—ญํ• 

โœ… 1. Spring Boot

Spring Boot๋Š” Spring ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‰ฝ๊ฒŒ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ.

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰์„ ์ž๋™ํ™”ํ•˜๊ณ , ํ•„์š”ํ•œ ์„ค์ •์„ ์ตœ์†Œํ™”ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

๐ŸŽฏ Spring Boot๊ฐ€ ํ•˜๋Š” ์ผ

1๏ธโƒฃ Spring ์„ค์ • ์ž๋™ํ™”

  • @SpringBootApplication์„ ์‚ฌ์šฉํ•˜๋ฉด @Configuration, @ComponentScan, @EnableAutoConfiguration์ด ํฌํ•จ๋จ
  • application.properties ๋˜๋Š” application.yml์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž๋™ ์„ค์ • ์ˆ˜ํ–‰

2๏ธโƒฃ ๋‚ด์žฅ ์›น ์„œ๋ฒ„ ์ œ๊ณต

  • Tomcat, Jetty, Undertow, Netty ๋“ฑ์„ ๋‚ด์žฅํ•˜์—ฌ ๋ณ„๋„ WAS ์„ค์น˜ ์—†์ด ์‹คํ–‰ ๊ฐ€๋Šฅ

3๏ธโƒฃ Spring Boot Starters ์ œ๊ณต

  • Starter๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‰ฝ๊ฒŒ ์ถ”๊ฐ€ (spring-boot-starter-web, spring-boot-starter-webflux ๋“ฑ)

4๏ธโƒฃ ํ”„๋กœ๋•์…˜ ์ง€์› ๊ธฐ๋Šฅ ํฌํ•จ

  • Actuator (spring-boot-starter-actuator)๋ฅผ ํ™œ์šฉํ•œ ๋ชจ๋‹ˆํ„ฐ๋ง, ํ—ฌ์Šค ์ฒดํฌ ๊ฐ€๋Šฅ
  • ๊ธฐ๋ณธ์ ์ธ ๋ณด์•ˆ ๋ฐ ๋กœ๊น… ์„ค์ • ์ œ๊ณต

 

โœ… 2. spring-boot-starter-web (Spring MVC)

spring-boot-starter-web์€ Spring MVC ๊ธฐ๋ฐ˜์˜ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” Starter์ด๋‹ค.

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
}

๐ŸŽฏ ์—ญํ• 

1๏ธโƒฃ Spring MVC ์ž๋™ ์„ค์ •

  • DispatcherServlet ์ž๋™ ๋“ฑ๋ก
  • @Controller, @RestController, @RequestMapping ๋“ฑ์˜ ๊ธฐ๋Šฅ ์ œ๊ณต

2๏ธโƒฃ ๋‚ด์žฅ Tomcat ๊ธฐ๋ณธ ์ œ๊ณต

  • ๋ณ„๋„๋กœ ์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฉด Tomcat์ด ๊ธฐ๋ณธ ๋‚ด์žฅ๋จ

3๏ธโƒฃ Blocking I/O ๋ฐฉ์‹ (Servlet ๊ธฐ๋ฐ˜)

  • ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ํ•ด๋‹น ์Šค๋ ˆ๋“œ๋Š” ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ
  • ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด ์Šค๋ ˆ๋“œ ํ’€์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ๋งŽ์€ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ์Šค๋ ˆ๋“œ๊ฐ€ ๋ถ€์กฑํ•  ์ˆ˜ ์žˆ์Œ

4๏ธโƒฃ ๋ณด์•ˆ ํ•„ํ„ฐ ๋™๊ธฐ ์ฒ˜๋ฆฌ

  • Spring Security ํ•„ํ„ฐ๋„ ๋™๊ธฐ์‹์œผ๋กœ ๋™์ž‘

 

๐Ÿ“Œ ํฌํ•จ๋œ ์ฃผ์š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์—ญํ• 
spring-webmvc Spring MVC ํ•ต์‹ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
spring-boot-starter-tomcat ๋‚ด์žฅ Tomcat ์„œ๋ฒ„ ์ œ๊ณต
jackson-databind JSON ์ง๋ ฌํ™”/์—ญ์ง๋ ฌํ™”
hibernate-validator ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๊ธฐ๋Šฅ ์ œ๊ณต

 

โœ… 3. spring-boot-starter-webflux (Spring WebFlux)

spring-boot-starter-webflux๋Š” Reactive Programming์„ ์ง€์›ํ•˜๋Š” WebFlux ๊ธฐ๋ฐ˜์˜ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” Starter์ž…๋‹ˆ๋‹ค.

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-webflux'
}

๐ŸŽฏ์—ญํ• 

1๏ธโƒฃ Spring WebFlux ์ž๋™ ์„ค์ •

  • @RestController, @RequestMapping, @GetMapping ๋“ฑ์˜ ๊ธฐ๋Šฅ ์ œ๊ณต
  • RouterFunction์„ ์ด์šฉํ•œ ํ•จ์ˆ˜ํ˜• ๋ผ์šฐํŒ… ์ง€์› (RouterFunctions.route())

2๏ธโƒฃ ๋‚ด์žฅ Netty ๊ธฐ๋ณธ ์ œ๊ณต

  • Tomcat ๋Œ€์‹  Netty ์„œ๋ฒ„๊ฐ€ ๊ธฐ๋ณธ ๋‚ด์žฅ๋จ
  • Jetty, Undertow, Tomcat ๋“ฑ์„ ์„ ํƒ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ

3๏ธโƒฃ Non-blocking I/O ๋ฐฉ์‹ (Reactive Streams ๊ธฐ๋ฐ˜)

  • ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋™์•ˆ ์Šค๋ ˆ๋“œ๊ฐ€ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ ๊ฐ€๋Šฅ
  • ๋งŽ์€ ์š”์ฒญ์„ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด ๋†’์€ ํ™•์žฅ์„ฑ์„ ๊ฐ€์ง

4๏ธโƒฃ ๋ณด์•ˆ ํ•„ํ„ฐ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ

  • Spring Security ํ•„ํ„ฐ๋„ ๋น„๋™๊ธฐ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘

 

๐Ÿ“Œ ํฌํ•จ๋œ ์ฃผ์š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์—ญํ• 
spring-webflux Spring WebFlux ํ•ต์‹ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
reactor-core ๋ฆฌ์•กํ‹ฐ๋ธŒ ์ŠคํŠธ๋ฆผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
spring-boot-starter-reactor-netty Netty ์„œ๋ฒ„ ์ œ๊ณต
jackson-databind JSON ์ง๋ ฌํ™”/์—ญ์ง๋ ฌํ™”

 

โœ…๐Ÿ”ฅ 4. spring-boot-starter-web vs spring-boot-starter-webflux ๋น„๊ต

ํ•ญ๋ชฉ spring-boot-starter-web (Spring MVC) spring-boot-starter-webflux (Spring WebFlux)
I/O ๋ชจ๋ธ Blocking (Servlet) Non-blocking (Reactive Streams)
๊ธฐ๋ณธ ๋‚ด์žฅ ์„œ๋ฒ„ Tomcat Netty
์Šค๋ ˆ๋“œ ๊ด€๋ฆฌ ์š”์ฒญ๋‹น ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ ์‚ฌ์šฉ ์ด๋ฒคํŠธ ๋ฃจํ”„ ๊ธฐ๋ฐ˜ (์Šค๋ ˆ๋“œ ํšจ์œจ์  ํ™œ์šฉ)
๋ณด์•ˆ ํ•„ํ„ฐ ๋™๊ธฐ ์ฒ˜๋ฆฌ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ
JSON ๋ณ€ํ™˜ Jackson Jackson or JSON/BSON via Project Reactor
์ ํ•ฉํ•œ ๊ฒฝ์šฐ ์ผ๋ฐ˜์ ์ธ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋Œ€๊ทœ๋ชจ ํŠธ๋ž˜ํ”ฝ, ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ (WebSocket, SSE ๋“ฑ)

์ฆ‰, spring-boot-starter-web์€ ๋™๊ธฐ์‹ ์›น ๊ฐœ๋ฐœ์—, spring-boot-starter-webflux๋Š” ๋น„๋™๊ธฐ์‹ ์›น ๊ฐœ๋ฐœ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค! ๐Ÿš€

 

โœ…โญ 5. WebFlux ๋Œ€์‹  Web(Spring MVC)์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

WebFlux(๋น„๋™๊ธฐ ๋ชจ๋ธ)์ด ์žฅ์ ๋ฟ์ธ๊ฒƒ ๊ฐ™์€๋ฐ, ์™œ ์ผ๋ฐ˜์ ์ธ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” Spring MVC(Servlet ๊ธฐ๋ฐ˜, ๋™๊ธฐ ๋ชจ๋ธ)์„ ๋” ๋งŽ์ด ์‚ฌ์šฉํ• ๊นŒ?

 

1๏ธโƒฃ ๊ธฐ์กด ๊ธฐ์ˆ  ์Šคํƒ๊ณผ์˜ ํ˜ธํ™˜์„ฑ

  • JDBC, JPA, Hibernate ๋Œ€๋ถ€๋ถ„์˜ DB ๋“œ๋ผ์ด๋ฒ„๊ฐ€ ๋™๊ธฐ ๋ฐฉ์‹.
  • WebFlux์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์˜คํžˆ๋ ค ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ๋‹ค.

 

2๏ธโƒฃ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ชจ๋ธ์˜ ๋‹จ์ˆœํ•จ

  •  ์ผ๋ฐ˜์ ์ธ ์›น์‚ฌ์ดํŠธ๋Š” ๋™๊ธฐ ๋ฐฉ์‹๋งŒ์œผ๋กœ๋„ ์ถฉ๋ถ„ํžˆ ๋น ๋ฆ„! 
  •  webflux๋Š” ๋ณ„๋„์˜ ํ•™์Šต์ด ํ•„์š”ํ•˜๋‹ค.
    • Spring Security ์„ค์ • ๋ฐฉ์‹์ด ๋‹ฌ๋ผ์ ธ์„œ ๋ณ„๋„ ํ•™์Šต ํ•„์š”.
    • WebFlux๋Š” ๋น„๋™๊ธฐ(์ฝœ๋ฐฑ) ๊ธฐ๋ฐ˜์ด๋ฏ€๋กœ, ์Šคํƒ ํŠธ๋ ˆ์ด์Šค ๋ถ„์„์ด ์–ด๋ ต๊ณ , ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ, ๋””๋ฒ„๊น…์ด ๋ณต์žก.

 

๐Ÿš€ ์ตœ์ข… ์ •๋ฆฌ

  • ์ผ๋ฐ˜์ ์ธ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(CRUD, ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€, ์‡ผํ•‘๋ชฐ, ๋ธ”๋กœ๊ทธ ๋“ฑ) → Spring MVC (spring-boot-starter-web) ์‚ฌ์šฉ์ด ์ ํ•ฉ!
  • ๋Œ€๊ทœ๋ชจ ํŠธ๋ž˜ํ”ฝ, ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆฌ๋ฐ(WebSocket, SSE, ์ฑ„ํŒ… ์„œ๋น„์Šค ๋“ฑ) → Spring WebFlux (spring-boot-starter-webflux)๊ฐ€ ์ ํ•ฉ!