IT기술/webflux (reactor)

Reactor: Spring WebFlux의 리액티브 스트림즈 구현체

후스파 2025. 4. 1. 09:23
반응형

spring framework webflux reactor

Reactor는 Spring WebFlux의 핵심 라이브러리로, 비동기 데이터 스트림을 처리하기 위한 리액티브 스트림즈 구현체입니다. Spring Framework 5부터 공식적으로 채택되어 사용되고 있으며, 비동기 프로그래밍 모델을 통해 효율적인 리소스 사용과 확장성을 제공합니다.

 

Reactor의 핵심 특징

리액티브 스트림즈 구현

Reactor는 리액티브 스트림즈 사양을 준수하는 라이브러리로, 비동기 데이터 처리를 위한 표준 인터페이스를 구현합니다. 이를 통해 Publisher, Subscriber, Subscription, Processor와 같은 리액티브 스트림즈의 핵심 인터페이스를 제공합니다.

 

비동기 논블로킹 처리

Reactor는 비동기 논블로킹 방식으로 작동하여 적은 수의 스레드로 많은 요청을 처리할 수 있습니다. 이는 전통적인 스레드 풀 방식과 달리, 이벤트 루프 모델을 사용하여 I/O 작업을 효율적으로 처리합니다.

 

풍부한 연산자 제공

Reactor는 데이터 스트림을 변환, 필터링, 결합하는 등의 다양한 연산자를 제공합니다. 이러한 연산자들은 함수형 프로그래밍 스타일로 조합하여 복잡한 데이터 처리 로직을 구현할 수 있게 해 줍니다.

 

백프레셔(Backpressure) 지원

Reactor는 데이터 생산자와 소비자 간의 속도 차이를 조절하는 백프레셔 메커니즘을 지원합니다. 이를 통해 시스템이 과부하 상태에 빠지지 않도록 데이터 흐름을 제어할 수 있습니다.

 

Mono와 Flux: Reactor의 핵심 타입

Reactor는 두 가지 핵심 타입을 제공합니다.

 

Mono

Mono는 0개 또는 1개의 결과만을 처리하기 위한 Publisher 구현체입니다. HTTP 요청에 대한 단일 응답이나 데이터베이스 쿼리의 단일 결과와 같은 단일 값을 표현할 때 사용됩니다.

Mono<String> mono = Mono.just("Hello");
mono.map(String::toUpperCase)
    .subscribe(System.out::println); // 출력: HELLO
 
 

Flux

Flux는 0개에서 N개의 결과를 처리하기 위한 Publisher 구현체입니다. 여러 항목을 포함하는 스트림이나 컬렉션을 표현할 때 사용됩니다.

Flux<String> flux = Flux.just("Hello", "World");
flux.map(String::toUpperCase)
    .filter(s -> s.startsWith("H"))
    .subscribe(System.out::println); // 출력: HELLO
 
 
 

Reactor 프로그래밍 모델

Reactor 프로그래밍은 일반적으로 다음과 같은 패턴을 따릅니다.

  1. 데이터 소스 생성: Flux나 Mono를 통해 데이터 소스를 생성합니다.
  2. 연산자 체인: 데이터를 변환, 필터링, 결합하는 등의 연산자를 체인 형태로 연결합니다.
  3. 구독: subscribe() 메서드를 호출하여 데이터 처리를 시작합니다.
Flux.just("apple", "banana", "cherry")
    .map(String::toUpperCase)
    .flatMap(s -> Mono.just("Flux: " + s))
    .subscribe(System.out::println);
 
 
 

Spring WebFlux에서의 Reactor 활용

Spring WebFlux는 Reactor를 기반으로 하며, 컨트롤러에서 Mono나 Flux를 반환하여 비동기 응답을 처리합니다.

@RestController
public class HelloWorldController {
    @GetMapping("/hello")
    public Mono<String> helloWorld() {
        return Mono.just("Hello, World!");
    }
    
    @GetMapping("/items")
    public Flux<String> getItems() {
        return Flux.just("Item1", "Item2", "Item3");
    }
}
 
 
 

Reactor 디버깅

Reactor 코드 디버깅은 일반적인 동기 코드보다 복잡할 수 있습니다. Reactor는 다음과 같은 디버깅 도구를 제공합니다.

  1. Hooks.onOperatorDebug(): 애플리케이션 시작 시 실행하여 전체 애플리케이션 범위의 디버깅 정보를 활성화합니다.
  2. checkpoint(): 특정 Publisher의 디버깅 정보를 활성화합니다.
  3. log(): Publisher의 이벤트를 로깅합니다.
Flux.just("Hello", "World")
    .map(String::toUpperCase)
    .checkpoint("After uppercase conversion")
    .filter(s -> s.startsWith("H"))
    .log()
    .subscribe(System.out::println);
 
 
 

결론

Reactor는 Spring WebFlux의 핵심 구성 요소로, 비동기 논블로킹 프로그래밍 모델을 통해 효율적인 리소스 사용과 확장성을 제공합니다. Mono와 Flux라는 두 가지 핵심 타입을 통해 다양한 비동기 데이터 처리 시나리오를 지원하며, 풍부한 연산자와 백프레셔 메커니즘을 통해 복잡한 데이터 흐름을 효과적으로 관리할 수 있습니다.

 

 

[WebFlux] Reactor 리액티브 스트림즈 구현체

Reactor란? Reactor는 Spring Framework 주도하에 개발된 리액티브 스트림즈의 구현체로, Spring Fra...

blog.naver.com

 

 

 

Spring WebFlux와 리액티브 프로그래밍의 기초: 함수형 인터페이스부터 함수 디스크립터까지

Spring WebFlux는 리액티브 프로그래밍 패러다임을 기반으로 한 프레임워크로, 비동기-논블로킹 방식의 애플리케이션 개발을 지원합니다. 이 글에서는 WebFlux의 핵심 개념인 리액티브 프로그래밍의

hoosfa.tistory.com

 

반응형