Spring Webflux
- Spring5์์ ์๋กญ๊ฒ ์ถ๊ฐ๋ ๋ชจ๋
- ๋น๋๊ธฐ์ ์ธ ์น ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์ ์ง์
- Reactor ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํ์ฌ ๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ์ ์ง์
- ์ ์ ์ค๋ ๋๋ก ๋ง์ ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์์
- HTTP ํด๋ผ์ด์ธํธ๋ ์ ๊ณต
- ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ์ง์
- Java์ Kotlin ๋ชจ๋์์ ์ฌ์ฉํ ์ ์์
- Spring Boot์ ํจ๊ป ์ฌ์ฉํ์ฌ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถ ๊ฐ๋ฅ
webmvc
- Spring MVC๋ ๊ธฐ๋ณธ์ ์ผ๋ก blocking์ด๊ณ ๋๊ธฐ๋ฐฉ์์ ์ฌ์ฉํ๋ค.
- ์ฌ์ฉ์์ ์์ฒญ์ด ๋ค์ด์ฌ ๋๋ง๋ค Thread๋ฅผ ์์ฑํ์ฌ ์ฒ๋ฆฌํ๋ค.
- ๋ณดํต์ ์์ฒญ ์๋ง๋ค ์ค๋ ๋๋ฅผ ์์ฑ, ์ญ์ ํด ์ฃผ๋ฉด ์ผ์ ํ ๋ฆฌ์์ค๊ฐ ์ง์์ ์ผ๋ก ์๋ชจ๋๋ฏ๋ก Thread๋ฅผ ๋ฏธ๋ฆฌ ์์ฑํด ์ ์ฅํด ๋๋ Thread Pool ์ ์์ฑํด ์ฌ์ฉํ๋ค.
- spring mvc ๊ฐ์ ๊ฒฝ์ฐ ์์ฒญ์ด ๋ค์ด์ค๋ฉด Queue์ ์๊ณ ์์์ ๋ฐ๋ผ์ Thread๋ฅผ ํ๋ ์ ์ ํด ์์ฒญ์ ์ฒ๋ฆฌํ๋ค.
- ์ค๋ ๋ ์๋ฅผ ์ด๊ณผํ๋ ์์ฒญ์ด ๋ฐ์ํ๋ค๋ฉด ๊ณ์ํด์ ์์ฒญ์ด ํ์ ๋๊ธฐํ๊ฒ ๋๋ Thread Pool Hell ํ์์ด ๋ฐ์ํ ์ ์๋ค.
webflux
- webflux๋ ์ด ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ด Event-Driven ๋ฐฉ์์ด๊ณ ๋น๋๊ธฐ non-blocking ๋ฐฉ์์ด๋ค.
- webflux๋ ์ด๋ฒคํธ ๋ฃจํ๊ฐ ๋์์ ์์ฒญ์ด ๋ฐ์ํ ๊ฒฝ์ฐ ๊ทธ๊ฒ์ ๋ง๋ ํธ๋ค๋ฌ์๊ฒ ์ฒ๋ฆฌ๋ฅผ ์์ํ๊ณ ์ฒ๋ฆฌ๊ฐ ์๋ฃ๋๋ฉด callback ๋ฉ์๋ ๋ฑ์ ํตํด ์๋ต์ ๋ฐํํ๋ค.
- ์ด ๋ฐฉ์์ ๊ฒฝ์ฐ ์์ฒญ์ด ์ฒ๋ฆฌ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์๊ธฐ ๋๋ฌธ์ Spring MVC์ ๋นํด ์ฌ์ฉ์์ ์์ฒญ์ ๋๋์ผ๋ก ๋ฐ์๋ผ ์ ์๋ค๋ ์ฅ์ ์ด ์๋ค.
WebFlux๋ฅผ ์ฌ์ฉํ๋ ์ด์
- ๋น๋๊ธฐ non-blocking ๋ฐฉ์์ ๋ฆฌ์กํฐ๋ธ ๊ฐ๋ฐ์ ์ฌ์ฉ๋ฉ๋๋ค.
- ์๋ฒ ํ๋ก๊ทธ๋จ์ด ํจ์จ์ ์ผ๋ก ๋์ํด์, cpu, thread, memory์ ์์์ ๋ญ๋นํ์ง์๊ณ ํจ์จ์ ์ผ๋ก ๋์ํ๋ ๊ณ ์ฑ๋ฅ ์น ์ดํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ๋ ๊ฑธ ๋ชฉ์ ์ผ๋ก ํฉ๋๋ค.
- ์๋น์ค๊ฐ ํธ์ถ์ด ๋ง์ ๋ง์ดํฌ๋ก ์๋น์ค ์ํคํ ์ฒ์ ์ ํฉํ๋ค
"์ ์ ์์ ์ค๋ ๋" ์ "์ต์ํ์ ํ๋์จ์ด ์์" ์ผ๋ก ๋์์ฑ์ ํธ๋ค๋งํ๊ธฐ ์ํด Webflux๊ฐ ํ์ํ์๋ค.
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ด webflux์ ๊ธฐ๋ฐ์ด ๋์๋ค
WebFlux ํจ์ํ ์คํ์ผ์ ํน์ง
- ๋ชจ๋ ์น ์์ฒญ ์ฒ๋ฆฌ ์์
์ ๋ช
์์ ์ธ ์ฝ๋๋ก ์์ฑํ๊ฒ ๋์ด์๋ค.
- ๊ธฐ์กด์ Spring MVC๋ ์ด๋ ธํ ์ด์ ์ ์ํ ํ๋ฆ ๊ด๋ก๋ฅผ ์ฌ์ค์ ์ธ์์ผ ์ฝ๋์ ํด์์ด ๊ฐ๋ฅํ๋ค.
- (์ด๋ ธํ ์ด์ ์ ๋ช ์์ ์ธ ๋ถ์์ด ํ๋ค๋ค.)
- ํจ์ํ ํ์ ์ WebFlux๋ ๋ช ์์ ์ธ ์ฝ๋๋ก ์์ฑํ๊ธฐ ๋๋ฌธ์ ๋ฉ์๋ ์๊ทธ๋์ฒ ๊ด๋ก์ ํ์ ์ฒดํฌ๊ฐ ๋ถ๊ฐ๋ฅํ ์ด๋ ธํ ์ด์ ์ ์์กดํ๋ MVC ์คํ์ผ๋ณด๋ค๋ ๋ช ํํ๋ค.
- ์ ํํ ํ์ ์ฒดํฌ ๊ฐ๋ฅ
- ํจ์ ์กฐํฉ์ ํตํ ํธ๋ฆฌํ ๊ตฌ์ฑ, ์ถ์ํ์ ์ ๋ฆฌํ๋ค.
- ํจ์ํ ์คํ์ผ์ด๊ธฐ ๋๋ฌธ์ ์ถ์ํ์ ๋ชจ๋ํ์ ์ ๋ฆฌํ๋ค.
- MVC ๋ณด๋ค ํ์ฅ์ ์ ๋ฆฌํ๋ค.
- ํ
์คํธ ์์ฑ์ด ํธ๋ฆฌํ๋ค.
- Spring MVC ๋ Controller ๋ Service ๋จ์๋ฅผ ํ ์คํธํ๊ธฐ์ํด์๋ ์ฌ์ค์ WebTest ๋ฅผ ์งํํด์ผํ์ง๋ง
- WebFlux๋ ํธ๋ค๋ฌ ๋ก์ง๊ณผ ์์ฒญ ๋งคํ, ๋ฆฌํด ๊ฐ ์ฒ๋ฆฌ๊น์ง ๋จ์ํ ์คํธ๋ก ์์ฑ ๊ฐ๋ฅ
Reactor Library
- Java 8+์์ ์๋ํ๋ Reactor ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด ๊ตฌํ๋๋ Reactive Programming ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- Reactor๋ Spring Framework 5์์ ์ฌ์ฉ๋๋ ๊ธฐ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค ํ๋์ด๋ค.
- Spring WebFlux์ ๊ฐ์ Spring ํ๋ก์ ํธ์์ Reactive Programming์ ์ง์ํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ค.
- Reactor๋ Reactor Core, Reactor Addons ๋ฐ Reactor Netty๋ก ๊ตฌ์ฑ๋๋ค.
Reactor Core
- Reactor์ ํต์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- Flux์ Mono์ ๊ฐ์ Reactive Stream ๊ธฐ๋ฐ ํ์
- Flux์ Mono์ ๋ํ ๋ณํ ์์ ์ ์ํํ๋ ์ฐ์ฐ์
- Hot Sequence๋ฅผ ์์ฑํ๋ Hot Stream์ ๋ํ ๋๊ตฌ๊ฐ ํฌํจ๋์ด ์๋ค.
Reactor Addons
- Reactor Core์ ์ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- Retry ๋ฐ Circuit Breaker์ ๊ฐ์ ๋ ๋์ ์ค๋ฅ ์ฒ๋ฆฌ, ๋ก๊น ๋ฐ ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
Reactor Netty
- Reactor Netty๋ Netty์ ์ผ๋ถ๋ถ์ผ๋ก Reactor์์ ์ฌ์ฉํ๋ Reactor Netty HTTP ๋ฐ TCP ์๋ฒ๋ฅผ ์ง์ํ๋ค.
Mono, Flux
๋ฆฌ์กํฐ๋ ๋ฆฌ์กํฐ๋ธ ์คํธ๋ฆผ์ ๊ตฌํํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก Mono ์ Flux 2๊ฐ์ง ๋ฐ์ดํฐ ํ์
์ผ๋ก ์คํธ๋ฆผ์ ์ ์ํ๋ค.
spring WebFlux๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ์ ์ธ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ์ฒ๋ฆฌ๋ฅผ ๋ฆฌ์กํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ ๊ณตํ๋ ๋ฐ์ดํฐ ํ์
์ธ Mono ์ Flux๋ก ๋ค๋ค์ผ ํ๋ค
"๊ทธ๋ ๊ธฐ ๋๋ฌธ์ WebFlux์์๋ ๋ชจ๋ ์๋ต์ Mono ํน์ Flux์ ๋ด์์ ๋ฐํํด ์ฃผ์ด์ผ ํ๋ค."
Mono ์ Flux ์ ์ฐจ์ด์
- Mono๋ 0-1๊ฐ์ ๊ฒฐ๊ณผ๋ง์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๊ฐ์ฒด
- Flux๋ 0-N๊ฐ์ธ ์ฌ๋ฌ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฐ์ฒด
Reactor๋ฅผ ์ฌ์ฉํด ์ผ๋ จ์ ์คํธ๋ฆผ์ ์ฝ๋๋ก ์์ฑํ๋ค ๋ณด๋ฉด ๋ณดํต ์ฌ๋ฌ ์คํธ๋ฆผ์ ํ๋์ ๊ฒฐ๊ณผ๋ฅผ ๋ชจ์์ค ๋ Mono๋ฅผ ์ฐ๊ณ , ๊ฐ๊ฐ์ Mono๋ฅผ ํฉ์ณ์ ์ฌ๋ฌ ๊ฐ์ ๊ฐ์ ์ฌ๋ฌ ๊ฐ์ ๊ฐ์ ์ฒ๋ฆฌํ๋ Flux๋ก ํํํ ์๋ ์๋ค.
Mono <>
- Mono ๋ 0 ๋๋ ํ๋์ ๋ฐ์ดํฐ ํญ๋ชฉ๊ณผ ์๋ฌ๋ฅผ ๊ฐ์ง๋ค.
Flux <>
- Flux ๋ 0 ๋๋ ํ๋ ์ด์์ ๋ฐ์ดํฐ ํญ๋ชฉ๊ณผ ์๋ฌ๋ฅผ ๊ฐ์ง๋ค.
Netty
- ํ๋กํ ์ฝ ์๋ฒ ๋ฐ ํด๋ผ์ด์ธํธ์ ๊ฐ์ ๋คํธ์ํฌ ์์ฉ ํ๋ก๊ทธ๋จ์ ๋น ๋ฅด๊ณ ์ฝ๊ฒ ๊ฐ๋ฐํ ์ ์๋
- NIO (Non-Blocking Input / output) ํด๋ผ์ด์ธํธ ์๋ฒ ํ๋ ์ ์ํฌ
- TCP ๋ฐ UDP ์์ผ ์๋ฒ์ ๊ฐ์ ๋คํธ์ํฌ ํ๋ก๊ทธ๋๋ฐ์ ํฌ๊ฒ ๋จ์ํํ๊ณ ๊ฐ์ํํ๋ค.
Netty ์ ์ฅ์
- NIO ๋คํธ์ํฌ ๊ธฐ๋ฐ Netty ํ๋ ์์ํฌ๋ ๋น๋๊ธฐ์ ์ด๋ฒคํธ ๊ธฐ๋ฐ ๋คํธ์ํน (Event Driven) ์ ์ง์ํ๋ค.
- Tomcat์๋ฒ๊ฐ 10,000๊ฑด์ ์ปค๋ฅ์ ์ ์ฒ๋ฆฌํ๋ค๋ฉด, netty๋ NIO ๋ฐฉ์์ผ๋ก ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์ ์์์ด ์ค๋ ๋๋ฅผ ๊ณ์ ์ ์ ํ๋ฉฐ Block ์ํ๋ฅผ ์ ์ง ํ์ง ์๋๋ค. => 10๋ฐฐ~100๋ฐฐ์ ์ปค๋ฅ์ ์ ์ฒ๋ฆฌํ ์ ์๋ค.
- ๋คํฐ์ ๊ฒฝ์ฐ์๋ ์ด๋ฒคํธ ๊ธฐ๋ฐ ๋ฐฉ์์ผ๋ก ๋์ํ๊ธฐ ๋๋ฌธ์ ์ค๋ ๋ ๊ฐ์๋ ๋จธ์ Core ๊ฐ์์ 2๋ฐฐ์ด๋ค.
Netty ์ ๊ตฌ์กฐ : ํต์ฌ ์ปดํฌ๋ํธ
Channel
- ํ๋ ์ด์์ ์ ์ถ๋ ฅ ์์ ์ ์ํํ ์ ์๋ ํ๋์จ์ด ์ฅ์น, ํ์ผ, ๋คํธ์ํฌ ์์ผ์ด๋ ํ๋ก๊ทธ๋จ ์ปดํฌ๋ํธ์ ๊ฐ์ Open๋ Connection
CallBack
- ์์ ์ ๋ํ ์ฐธ์กฐ๋ฅผ ์ ๊ณตํ๋ ๋ฉ์๋
- ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ ๋ Netty ๋ด๋ถ์ ์ผ๋ก ์ฝ๋ฐฑ์ ์ด์ฉํ๋๋ฐ, ์ด๋ ChannelHandler ์ธํฐํ์ด์ค๋ฅผ ํตํด ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌ
Future
- ์์ ์ด ์๋ฃ๊ฐ ๋ ๊ฒฝ์ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ฆฐ๋ค.
- Future ๊ฐ์ฒด๋ ๋น๋๊ธฐ ์์ ์ ๊ฒฐ๊ณผ๋ฅผ ๋ด๋ Plachloder์ ์ญํ ์ ํ๋ค.
- ์ด๋ ChannelFuture ์ธํฐํ์ด์ค๋ฅผ ์ด์ฉํด ๊ฒฐ๊ณผ๊ฐ์ ํ์ฉํ๋ค.
Event์ Handler
- Netty๋ ์์ ์ํ์ ๋ณํ๋ฅผ ์๋ฆฌ๊ธฐ ์ํด ์ด๋ฒคํธ๋ฅผ ์ด์ฉํ๊ณ , ๋ฐ์ํ ์ด๋ฒคํธ๋ฅผ ๊ธฐ์ค์ผ๋ก Handler๋ฅผ ํตํด ํธ๋ฆฌ๊ฑฐํ๋ค.
Event Loop
- ์ ์ ๊ฐ ์ ์ถ๋ ฅ์ ์๊ตฌํ ๊ฒฝ์ฐ์ ํ๋ฆ
PipeLine
- ์ด๋ฒคํธ ๋ฃจํ์์ ์ด๋ฒคํธ๋ฅผ ๋ฐ์ ํธ๋ค๋ฌ์ ์ ๋ฌํ๋ ์ญํ ์ ํ๋ค.
Reactor๋ Reactor Core์ Flux์ Mono์ ๊ฐ์ ํ์ ์ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ ๋ฐ ์ด๋ฒคํธ ๊ธฐ๋ฐ ์์คํ ์์ ์ฒ๋ฆฌ ์์ ์ ์ฒ๋ฆฌํ๋ค. Reactive Programming์ ๋น๋๊ธฐ ์ด๋ฒคํธ ์ฒ๋ฆฌ ๋ฐ ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ๊ตฌํํ๊ธฐ ์ํ ํจ๋ฌ๋ค์์ด๋ฉฐ
๋น๋๊ธฐ์ฑ, ์ผ๊ด์ฑ, ์ด๋ฒคํธ ๊ธฐ๋ฐ ์ฒ๋ฆฌ, ๋น๋๊ธฐ ์ค๋ฅ ์ฒ๋ฆฌ ๋ฐ ๋์ ๊ฐ์ฉ์ฑ๊ณผ ๊ฐ์ ์ด์ ์ ์ ๊ณตํ๋ค.
Spring R2DBC
(Reactive Relational DataBase Connectivity)
Reactive Programming์ ํ๋ ๊ณผ์ ์์ Database ์ฌ์ฉ์ด ํ์ํ ๊ฒฝ์ฐ์ ์ฌ์ฉํ๋ค.
๋ง์ ์์ ๋ก Project Reactor ๊ธฐ๋ฐ์ Spring Webflux๋ฅผ ์ฌ์ฉํ๋ฉฐ Database๋ฅผ ์ฌ์ฉํด์ผํ ๋ R2DBC๋ฅผ ๋ง์ด ์ฌ์ฉํ๋ค.
"Spring์์ ๋ง์ด ์ฌ์ฉํ๋ JPA๋ฅผ ์ฌ์ฉํ ์๋ ์๋?"
"์ฌ์ฉํ ์ ์๋ค. ํ์ง๋ง ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ง ์๋ค."
JPA๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋น๋๊ธฐ๋ฅผ ์ ๊ณตํ์ง ์๋๋ค.
์ฆ, Webflux ๊ธฐ๋ฐ์์ JPA๋ฅผ ์ฌ์ฉํ๋ฉด Database ๋ถ๋ถ์์ block๋๊ณ , ๊ทธ๋์ thread๊ฐ ๊ธฐ๋ค๋ฆฌ๊ฒ ๋๋ค.
Webflux ๊ฐ์ ์ ์ ์์ thread๋ฅผ ๊ณ์ํด์ ์ฌ์ฉํ๋ framework์์ ์ด๋ฌํ ์์ ์ ๋นํจ์จ์ ์ด๋ฉฐ ์ ์ฒด ์์คํ ์ ์ํฅ์ด ๊ฐ ์ ์๋ค. ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋์จ ๊ฒ์ด R2DBC์ด๋ค.
R2DBC๋ Reactive programming ๊ธฐ๋ฐ์ด๋ค๋ณด๋ Reactive programming์ด ๊ฐ์ง๋ ์ฅ์ ์ ๊ทธ๋๋ก ๊ฐ๋๋ค.
์ฆ, Blocking programming์ผ ๋๋ณด๋ค ๋์ ๋์์ฑ(High Concurrency)์ด ์๊ตฌ๋๋ ์ํฉ์์ ๋ ์ข์ ์ฑ๋ฅ์ ๋ผ ์ ์๋ค.
Spring: Blocking vs non-blocking: R2DBC vs JDBC and WebFlux vs Web MVC
Spring WebFlux and R2DBC perform better at higher concurrency than Spring Web MVC and JDBC
medium.com
๋์์ฑ(Concurrency)์ด ๋์์ง์ ๋ฐ๋ผ MVC-JDBC๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค Latency๋ ๋ ์ค์๊ณ , Throughput์ ๋ ์ฆ๊ฐํ๋ค.
๊ทธ๋ฌ๋ ์์ง!
- ๊ธฐ์ ์ธก๋ฉด์์ ์๋ จ๋๊ฐ ๋์ง ์๋ค. Blocking ๋ฐฉ์์ ๋นํด ์ฌ์ฉ์๋ ๋ง์ง ์๊ณ , ์ปค๋ฎค๋ํฐ์ ๋ถ์ฌ, ๋ ธํ์ฐ ๋ฐ ์๋ฃ์ ์ ์, ํผ๋๋ฐฑ์ ๋ฐ๊ธฐ ์ด๋ ค์ ๋ฑ ์ด์๊ฐ ์๋ค.
- ๊ตฌํ์ฒด ์ธก๋ฉด์์๋ ์์ง ์ ๊ณต๋์ง ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฒค๋๊ฐ ์๋ค. ๋ํ, ๊ณต์์ ์ผ๋ก ๋ฒค๋์ฌ์์ ์ ๊ณตํ์ง ์๋ ๊ฒฝ์ฐ๋ ์๋ค. ์ด๋ฐ ๊ฒฝ์ฐ์ ์ถํ ๊ด๋ฆฌ ์ธก๋ฉด์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ผ๋ฏ๋ก ๋์ ํ๋๋ฐ ๊ณ ๋ คํด๋ด์ผํ ์ ์ด ๋ง๋ค.
- Spring ์ง์์์๋ R2DBC๋ฅผ ์ํ Spring Data R2DBC ๋ฅผ ์ง์ํ์ง๋ง ์์ง ๋ถ์กฑํ ์ ์ด ๋ง๋ค.
API ์์
Controller
@Controller
public class UserController {
private final UserService userService;
@GetMapping("/users")
public Flux<User> getAllUsers() {
return userService.getAllUsers();
}
@PostMapping("/users")
public Mono<User> createUser(@RequestBody User user) {
return userService.createUser(user);
}
@PutMapping("/users/{id}")
public Mono<ResponseEntity<User>> updateUser(@PathVariable("id") String id, @RequestBody User user) {
return userService.updateUser(id, user)
.map(updatedUser -> ResponseEntity.ok().body(updatedUser))
.defaultIfEmpty(ResponseEntity.notFound().build());
}
@DeleteMapping("/users/{id}")
public Mono<ResponseEntity<Void>> deleteUser(@PathVariable("id") String id) {
return userService.deleteUser(id)
.map(user -> ResponseEntity.ok().<Void>build())
.defaultIfEmpty(ResponseEntity.notFound().build());
}
}
Service
public interface UserService {
Mono<User> getUserById(String id);
Flux<User> getAllUsers();
Mono<User> createUser(User user);
Mono<User> updateUser(String id, User user);
Mono<Void> deleteUser(String id);
}
@Service
public class UserServiceImpl implements UserService {
private final UserRepository userRepository;
@Override
public Flux<User> getAllUsers() {
return userRepository.findAll();
}
@Override
public Mono<User> createUser(User user) {
return userRepository.save(user);
}
@Override
public Mono<User> updateUser(String id, User user) {
return userRepository.findById(id)
.flatMap(existingUser -> {
existingUser.setName(user.getName());
existingUser.setEmail(user.getEmail());
return userRepository.save(existingUser);
});
}
@Override
public Mono<Void> deleteUser(String id) {
return userRepository.deleteById(id);
}
}
'Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Spring WebClient (0) | 2023.04.30 |
---|---|
Spring ๋ฉด์ ๋๋น ์ ๋ฆฌ (0) | 2023.02.01 |