🖥️ 백엔드/스프링
[스프링] WebFlux와 Reactor
케로⸝⸝◜࿀◝ ⸝⸝
2024. 6. 18. 13:47
개요
Spring WebFlux는 비동기적이고 논블로킹(non-blocking) 방식의 웹 애플리케이션 프레임워크로, 기존의 Spring MVC와 달리 반응형 프로그래밍(reactive programming)을 지원한다. WebFlux는 특히 높은 트래픽을 효율적으로 처리해야 하는 애플리케이션에서 유용하며, 이때 핵심적인 역할을 하는 것이 Reactor이다.
Spring WebFlux와 Reactor
Reactor는 반응형 스트림(Reactive Streams)을 지원하는 라이브러리로, 비동기 데이터 스트림을 조작하고 처리하는 데 중점을 둔다. Spring WebFlux는 이 Reactor를 바탕으로 반응형 프로그래밍 모델을 제공한다. 주요 개념과 기능은 다음과 같다.
1. Reactor의 주요 컴포넌트
Mono
- 0개 또는 1개의 데이터
- 단일 값이나 단일 이벤트의 결과를 나타낼 때 사용
- 예를 들어, 데이터베이스 조회나 HTTP 요청의 결과가 단일 값인 경우 Mono를 사용
Flux
- 0개 이상의 데이터
- 여러 값이나 이벤트 스트림을 나타낼 때 사용
- 예를 들어, 데이터베이스의 여러 레코드나 지속적으로 발생하는 이벤트 스트림의 경우 Flux를 사용
@RestController
public class ReactiveController {
@GetMapping("/mono")
public Mono<String> getMono() {
return Mono.just("Hello, Mono!");
}
@GetMapping("/flux")
public Flux<String> getFlux() {
return Flux.just("Hello", "World", "From", "Flux");
}
}
→ 간단한 문자열 데이터를 비동기적으로 반환
2. 비동기 및 논블로킹 처리
- Reactor는 비동기적으로 데이터를 처리하며, 데이터가 준비될 때까지 스레드를 블로킹하지 않음
- 높은 성능과 높은 자원 효율성
3. 반응형 연산자
- Reactor는 데이터를 조작할 수 있는 다양한 연산자를 제공
- 이 연산자는 스트림 데이터를 필터링, 매핑, 집계하는 데 사용된다.
Flux.just(1, 2, 3, 4, 5)
.filter(i -> i % 2 == 0) // 짝수만 필터링
.map(i -> i * 2) // 값을 두 배로 변환
.subscribe(System.out::println); // 결과 출력
4. 백프레셔(Backpressure)
- Reactor는 소비자가 감당할 수 있는 속도로 데이터를 요청하도록 백프레셔를 지원
- 이는 데이터 생성자 너무 빠르게 데이터를 보내 소비자가 이를 처리하지 못하는 기능을 방지
Spring WebFlux의 주요 기능
- 비동기 및 논블로킹 I/O
- HTTP 요청을 비동기적으로 처리하고, 데이터베이스나 다른 서비스와의 통신도 논블로킹 방식으로 수행
- 고성능
- 적은 리소스로 높은 트래픽을 처리할 수 있으며, 특히 많은 수의 동시 접속을 처리하는 데 적합
- 리액티브 API
- 기존의 블로킹 API 대신 비동기 스트림 기반의 API를 제공
참고 사이트
반응형