Spring WebFlux란?
Spring WebFlux는 비동기(Asynchronous) 및 논블로킹(Non-blocking) 방식으로 동작하는 웹 프레임워크로, Spring 5에서 처음 도입되었음.
✅ Spring WebFlux의 특징
1. 비동기 & 논블로킹 (Asynchronous & Non-blocking)
• 기존 Spring MVC는 요청을 처리하는 동안 스레드를 블로킹하지만, WebFlux는 논블로킹 방식으로 동작하여 높은 동시성 처리 가능.
2. 리액티브 스트림(Reactive Streams) 기반
• Publisher와 Subscriber 개념을 활용하여 데이터 스트림을 처리.
• Project Reactor의 Mono와 Flux를 사용하여 비동기 데이터 흐름을 제어.
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(리액티브 스트림) 를 기반으로 동작하며, 대표적으로 Mono와 Flux 두 가지 리턴 타입을 제공함.
📌 리액티브 스트림이란?
리액티브 스트림(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 |