Hamutaro - Hamtaro 4

Backend/Spring

[Spring] Spring WebFlux ๋ž€ ๋ฌด์—‡์ธ๊ฐ€

carsumin 2026. 1. 5. 15:25
Spring WebFlux ๋ž€?
  • Spring 5 ๋ถ€ํ„ฐ ๋„์ž…๋œ ๋น„๋™๊ธฐ/๋…ผ๋ธ”๋กœํ‚น ์›น ํ”„๋ ˆ์ž„์›Œํฌ
  • Reactive Streams ๊ธฐ๋ฐ˜, ์ ์€ ์Šค๋ ˆ๋“œ๋กœ ๋งŽ์€ ์š”์ฒญ ์ฒ˜๋ฆฌ

-> ๊ธฐ์กด Spring MVC = Blocking I/O

-> WebFlux = Non-Blocking I/O + ์ด๋ฒคํŠธ ๋ฃจํ”„

 

 

WebFlux ์˜ ๋“ฑ์žฅ ๋ฐฐ๊ฒฝ
  1. Spring MVC์˜ ๊ตฌ์กฐ์  ํ•œ๊ณ„
    • ์š”์ฒญ 1๊ฑด = ์Šค๋ ˆ๋“œ 1๊ฐœ
    • I/O ๋Œ€๊ธฐ๋™์•ˆ ์Šค๋ ˆ๋“œ ์ ์œ 
    • ํŠธ๋ž˜ํ”ฝ ์ฆ๊ฐ€ -> ์Šค๋ ˆ๋“œ ๊ณ ๊ฐˆ -> ์‘๋‹ต ์ง€์—ฐ
  2. WebFlux์˜ ํ•ด๊ฒฐ ๋ฐฉ์‹
    • I/O ๋Œ€๊ธฐ ์ค‘ ์Šค๋ ˆ๋“œ ๋ฐ˜ํ™˜
    • ์ด๋ฒคํŠธ๊ฐ€ ์˜ค๋ฉด ๋‹ค์‹œ ์ด์–ด์„œ ์ฒ˜๋ฆฌ
    • ์ ์€ ์Šค๋ ˆ๋“œ๋กœ ๋™์‹œ์„ฑ ์ฒ˜๋ฆฌ
WebFlux = CPU๊ฐ€ ์•„๋‹ˆ๋ผ I/O ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ๋ณ‘๋ชฉ์ธ ์„œ๋น„์Šค๋ฅผ ์œ„ํ•œ ๋ชจ๋ธ

 

 

WebFlux ํ•ต์‹ฌ ๊ฐœ๋…
  • Reactive Streams
    • Publisher : ๋ฐ์ดํ„ฐ ๋ฐœํ–‰
    • Subscriber : ๋ฐ์ดํ„ฐ ๊ตฌ๋…
    • Backpressure : ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅํ•œ ๋งŒํผ๋งŒ ์š”์ฒญ
  • Mono / Flux
    • Mono<T> : 0~1 ๊ฑด
    • Flux<T> : 0~N ๊ฑด
Mono<User> findUser();
Flux<Order> findOrders();

 

-> return ๊ฐ’ ์ž์ฒด๊ฐ€ ๋ฏธ๋ž˜์— ๋„์ฐฉํ•  ๋ฐ์ดํ„ฐ

 

  • Non-Blocking I/O 
    • ์š”์ฒญ ์ฒ˜๋ฆฌ ์Šค๋ ˆ๋“œ ≠ I/O ์ฒ˜๋ฆฌ ์Šค๋ ˆ๋“œ
    • ๋Œ€๊ธฐ ์—†์Œ. ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์žฌ๊ฐœ

 

Spring MVC vs WebFlux ๋น„๊ต
๊ตฌ๋ถ„ Spring MVC WebFlux
ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ชจ๋ธ ๋™๊ธฐ ๋น„๋™๊ธฐ
I/O Blocking Non-Blocking
์Šค๋ ˆ๋“œ ๋ชจ๋ธ ์š”์ฒญ๋‹น 1๊ฐœ ์ด๋ฒคํŠธ ๋ฃจํ”„
๋ฐ˜ํ™˜ ํƒ€์ž… ๊ฐ์ฒด Mono / Flux
ํ•™์Šต ๋‚œ์ด๋„ ๋‚ฎ์Œ ๋†’์Œ

 

 

WebFlux๋Š” ์–ธ์ œ ์“ธ๊นŒ?
  • ์™ธ๋ถ€ API ํ˜ธ์ถœ์ด ๋งŽ์€ ์„œ๋น„์Šค
  • ์ŠคํŠธ๋ฆฌ๋ฐ (SSE, WebSocket)
  • ๋Œ€๊ทœ๋ชจ ํŠธ๋ž˜ํ”ฝ, ๊ณ ๋™์‹œ์„ฑ
  • MSA ํ™˜๊ฒฝ์˜ API Gateway

 

๊ฐ„๋‹จ ์˜ˆ์ œ
  • Controller
@GetMapping("/user/{id}")
public Mono<UserResponse> getUser(@PathVariable Long id){
	return userService.findById(id)
    		.map(UserResponse::from);
}
  • Service
public Mono<User> findById(Long id) {
	return userRepository.findById(id);
}
  • ์—๋Ÿฌ ์ฒ˜๋ฆฌ
return userService.findById(id)
	.switchIfEmpty(Mono.error(new NotFoundException()));