카테고리 없음
spring web flux와 flat map
홍호나
2025. 3. 14. 14:31
Spring WebFlux는 비동기(Asynchronous) + 논블로킹(Non-blocking) 방식의 리액티브 웹 프레임워크이다.
🔹 주요 특징
- Servlet 기반(Spring MVC)과 달리, 비동기 방식으로 동작
- Reactor 기반(Mono, Flux)으로 데이터를 스트림 형태로 처리
- Netty, Undertow 같은 비동기 서버와 함께 사용 가능
- 대량의 동시 요청을 처리할 때 성능이 뛰어남
🔹 언제 사용해야 할까?
- 대량의 동시 요청을 처리해야 할 때
- WebSocket, SSE(Server-Sent Events) 같은 실시간 데이터 스트리밍이 필요할 때
- API 호출이 많아 I/O 대기가 많은 시스템 (ex: 외부 API 호출, DB 조회 등)
✅ 비동기 논블로킹 방식이라 높은 성능을 제공하지만, 기존 MVC 패턴과 차이가 있어 학습이 필요함
🔹 flatMap이란?
Spring WebFlux에서 flatMap은 비동기 처리된 결과를 다시 다른 비동기 스트림으로 변환할 때 사용하는 연산자이다.
🔹 map과 flatMap의 차이
연산자 반환 타입 특징
map | 값 그대로 변환 | 단순 변환, 내부에서 비동기 호출 불가 |
flatMap | 비동기 타입(Mono/Flux) 반환 | 내부에서 새로운 비동기 호출 가능 |
🔹 flatMap 예제
❌ map 사용 (잘못된 예제)
fun getUser(id: String): Mono<User> { ... }
fun getOrders(user: User): Mono<List<Order>> { ... }
userService.getUser("123")
.map { user -> getOrders(user) } // Mono<Mono<List<Order>>> 타입이 됨
💡 map을 사용하면 Mono<Mono<List<Order>>> 형태가 되어 중첩된 Mono가 발생한다.
✅ flatMap 사용 (올바른 예제)
userService.getUser("123")
.flatMap { user -> getOrders(user) } // Mono<List<Order>> 타입으로 변환됨
💡 flatMap을 사용하면 Mono<List<Order>> 형태로 중첩 없이 변환된다.
✅ 결론:
- map: 값 자체를 변환할 때 사용
- flatMap: 비동기 결과를 다시 새로운 비동기 스트림으로 변환할 때 사용