BE/Spring & Spring Boot

[Spring Boot] WebFlux

baek-dev 2025. 4. 1. 18:52

Spring WebFlux란?

 

Spring WebFlux비동기(Asynchronous) 및 논블로킹(Non-blocking) 방식으로 동작하는 웹 프레임워크로, Spring 5에서 처음 도입되었음.

 

✅ Spring WebFlux의 특징

 

1. 비동기 & 논블로킹 (Asynchronous & Non-blocking)

기존 Spring MVC는 요청을 처리하는 동안 스레드를 블로킹하지만, WebFlux는 논블로킹 방식으로 동작하여 높은 동시성 처리 가능.

 

2. 리액티브 스트림(Reactive Streams) 기반

PublisherSubscriber 개념을 활용하여 데이터 스트림을 처리.

Project ReactorMonoFlux를 사용하여 비동기 데이터 흐름을 제어.

 

3. 함수형 엔드포인트 지원

기존 @Controller 방식뿐만 아니라 함수형 라우팅(Functional Endpoint) 도 지원.

 

4. Spring MVC와 공존 가능

Spring MVC와 함께 사용할 수 있으며, WebFlux는 선택적으로 활용 가능.

 

5. Servlet이 아닌 Netty, Undertow와 같은 비동기 서버 지원

Spring MVC는 기본적으로 Tomcat을 사용하지만, WebFlux는 Netty, Undertow 같은 논블로킹 서버를 사용할 수 있음.

 


1️⃣ Spring WebFlux vs Spring MVC 비교

비교 항목 Spring MVC (서블릿 기반) Spring WebFlux (리액티브)
처리 방식 동기(Synchronous) & 블로킹(Blocking) 비동기(Asynchronous) & 논블로킹(Non-blocking)
스레드 모델 요청마다 새로운 스레드 할당 이벤트 루프 기반 (소수의 스레드 사용)
요청 처리 방식 DispatcherServlet Reactor 기반의 리액티브 엔진 사용
리턴 타입 ModelAndView, ResponseEntity Mono<T>, Flux<T>
사용하는 웹 서버 Tomcat, Jetty Netty, Undertow (Servlet 컨테이너 사용 가능)
성능 많은 스레드 필요 → 메모리 사용량 증가 적은 스레드로 높은 동시성 처리 가능
사용 사례 CRUD API, 전통적인 MVC 웹 애플리케이션 고성능 API, 스트리밍 서비스, 마이크로서비스

 

✅ 결론:

요청량이 적고 CRUD 중심의 전통적인 웹 애플리케이션Spring MVC 적합

대량의 요청을 동시에 처리해야 하는 경우Spring WebFlux 적합

 


2️⃣ WebFlux의 핵심 개념: 리액티브 프로그래밍

 

WebFlux는 Reactive Streams(리액티브 스트림) 를 기반으로 동작하며, 대표적으로 MonoFlux 두 가지 리턴 타입을 제공함.

 

📌 리액티브 스트림이란?

 

리액티브 스트림(reactive streams)은 비동기 데이터 스트림을 처리하는 표준 프로그래밍 모델로 다음 4가지 개념을 포함함.

개념 설명
Publisher (발행자) 데이터를 생성하고 전송하는 역할
Subscriber (구독자) 데이터를 구독하여 소비하는 역할
Subscription (구독 정보) Publisher와 Subscriber 간의 연결을 관리
Processor (중간 처리자) Publisher의 데이터를 변환 후 Subscriber에게 전달

 

📌 WebFlux에서는 Project Reactor 라이브러리(Mono와 Flux)를 사용하여 리액티브 스트림을 처리함.

 


3️⃣ WebFlux에서 Mono & Flux 사용법

 

✅ Mono<T> - 단일 값(0~1개)의 데이터를 처리

import reactor.core.publisher.Mono;

public class MonoExample {
    public static void main(String[] args) {
        Mono<String> mono = Mono.just("Hello, WebFlux!");

        mono.subscribe(System.out::println); // "Hello, WebFlux!" 출력
    }
}

Mono.just("데이터") → 단일 값을 가진 Mono 생성

.subscribe() → 데이터를 구독하여 출력

 


✅ Flux<T> - 여러 개의 데이터(0~N개)를 처리

import reactor.core.publisher.Flux;

public class FluxExample {
    public static void main(String[] args) {
        Flux<String> flux = Flux.just("A", "B", "C");

        flux.subscribe(System.out::println);
    }
}

출력 결과:

A
B
C

Flux.just("A", "B", "C") → 3개의 데이터를 포함하는 Flux 생성

.subscribe() → 모든 데이터를 하나씩 소비

 

📌 Flux는 map(), filter(), flatMap() 등 여러 연산자를 통해 데이터 스트림을 조작 가능.

 


4️⃣ Spring WebFlux에서 REST API 만들기

 

✅ 1. WebFlux 의존성 추가 (Spring Boot)

 

📌 spring-boot-starter-webflux 추가

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

 

 


✅ 2. 기본적인 WebFlux 컨트롤러 작성

import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

@RestController
@RequestMapping("/users")
public class UserController {

    @GetMapping("/{id}")
    public Mono<String> getUserById(@PathVariable String id) {
        return Mono.just("User " + id);
    }

    @GetMapping
    public Flux<String> getAllUsers() {
        return Flux.just("User1", "User2", "User3");
    }
}

📝 주요 포인트

Mono<String> → 단일 데이터 반환 (단일 사용자 조회)

Flux<String> → 여러 개의 데이터 반환 (모든 사용자 조회)

 

📌 WebFlux에서는 Mono<T>Flux<T>를 반환하면 자동으로 논블로킹 방식으로 HTTP 응답이 처리됨.

 


5️⃣ WebFlux에서 데이터베이스 연동 (R2DBC)

 

✅ R2DBC (Reactive Relational Database Connectivity)란?

Spring WebFlux에서 비동기 방식으로 RDBMS (MySQL, PostgreSQL 등)와 연동하는 기술.

JPA(Hibernate)와 다르게 Blocking을 사용하지 않고, 논블로킹 방식으로 SQL 실행.

 

📌 의존성 추가

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-r2dbc</artifactId>
</dependency>
<dependency>
    <groupId>io.r2dbc</groupId>
    <artifactId>r2dbc-h2</artifactId>
</dependency>

 

 

📌 리액티브 Repository 인터페이스

import org.springframework.data.repository.reactive.ReactiveCrudRepository;
import reactor.core.publisher.Mono;

public interface UserRepository extends ReactiveCrudRepository<User, String> {
    Mono<User> findByName(String name);
}

 

📌 Service 레이어

import org.springframework.stereotype.Service;
import reactor.core.publisher.Mono;

@Service
public class UserService {
    private final UserRepository repository;

    public UserService(UserRepository repository) {
        this.repository = repository;
    }

    public Mono<User> getUserByName(String name) {
        return repository.findByName(name);
    }
}

 

📌 비동기 데이터베이스 호출을 통해 성능을 극대화할 수 있음!

 


6️⃣ WebFlux의 장점과 단점

장점 단점
높은 동시성 처리 가능 기존 MVC와 코드 스타일이 다름
Netty 기반으로 성능 최적화 디버깅이 어려울 수 있음
비동기 I/O를 활용하여 응답 속도 개선 모든 라이브러리가 리액티브를 지원하는 것은 아님

 

정리하면:

WebFlux는 비동기 논블로킹 환경에서 고성능을 낼 수 있는 웹 프레임워크.

JPA 대신 R2DBC를 사용하면 비동기 방식으로 RDBMS 연동 가능.

 

 

 

 

출처 : ChatGPT

'BE > Spring & Spring Boot' 카테고리의 다른 글

[Spring Boot] @CacheEvict  (0) 2025.04.15
[Spring Boot] 소셜로그인  (1) 2025.04.07
[Spring Boot] DAO와 Repository의 차이?  (1) 2025.03.31
[Spring Boot] DAO  (0) 2025.03.30
[Spring Boot] ApplicationContext  (0) 2025.03.23