카테고리 없음

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: 비동기 결과를 다시 새로운 비동기 스트림으로 변환할 때 사용