Spring

리액티브 프로그래밍 > RxJava와 Spring WebFlux 비교

curiousKidd 2025. 2. 6. 00:05
반응형

리액티브 프로그래밍은 비동기 데이터 스트림이벤트 흐름을 처리하는 새로운 패러다임입니다.

Java 환경에서 사용되는 RxJava와, Spring 생태계에서 제공하는 Spring WebFlux의 리액티브 기능에 대해 알아보고,

각 기술의 예제 코드를 통해 설명해보겠습니다.


1. 리액티브 프로그래밍 개념

리액티브 프로그래밍은 다음과 같은 특징을 가지고 있습니다.

  • 비동기 처리: 데이터가 도착하는 대로 즉시 처리할 수 있음
  • 논블로킹 I/O: 요청이 끝날 때까지 기다리지 않고 다른 작업을 수행 가능
  • 데이터 스트림: 연속적으로 발생하는 데이터를 스트림으로 다룸
  • 백프레셔(Backpressure): 소비자가 데이터를 처리하지 못할 경우, 생산자가 데이터를 조절하는 메커니즘 제공

이러한 개념은 고성능 서버, 실시간 애플리케이션, 그리고 사용자 인터랙션이 많은 모바일 앱 등 다양한 분야에서 유용하게 사용됩니다.


2. RxJava

RxJava란?

RxJava는 Java 언어에서 리액티브 프로그래밍을 구현하기 위한 라이브러리입니다. 데이터 스트림(Observable)과 구독자(Observer)를 사용하여, 데이터를 비동기적으로 처리할 수 있습니다.

RxJava 예제 코드

아래 예제는 1부터 5까지의 숫자를 방출하여, 각 숫자를 두 배로 변환한 후 결과를 출력하는 간단한 RxJava 프로그램입니다.

//implementation 'io.reactivex.rxjava3:rxjava:3.0.6' < gradle
import io.reactivex.rxjava3.core.Observable;

public class RxJavaExample {
    public static void main(String[] args) {
        // 1. Observable을 생성하여 1부터 5까지의 숫자를 방출합니다.
        Observable<Integer> numbers = Observable.just(1, 2, 3, 4, 5);

        // 2. 각 숫자를 두 배로 변환하는 연산을 수행합니다.
        numbers
            .map(i -> i * 2)
            // 3. subscribe()를 통해 결과 출력, 에러 처리, 완료 시 메시지 출력
            .subscribe(
                item -> System.out.println("RxJava Result: " + item),  // 데이터 처리
                error -> System.err.println("Error: " + error),         // 에러 처리
                () -> System.out.println("RxJava Completed")            // 완료 메시지 출력
            );
    }
}

RxJava의 장단점

  • 장점:
    • 다양한 연산자(operator)를 제공해 복잡한 데이터 스트림 변환이 용이함
    • 웹, 안드로이드, 데스크탑 등 범용 애플리케이션에서 비동기 처리를 구현 가능
    • 오랜 시간 사용되어온 만큼 자료와 커뮤니티 지원이 탄탄함
  • 단점:
    • Spring과 같은 프레임워크와의 기본 통합은 제공하지 않음
    • 리액티브 스트림에 대한 개념을 처음 접할 경우 다소 학습 곡선이 있음

3. Spring WebFlux

Spring WebFlux란?

Spring WebFlux는 Spring 5에서 도입된 리액티브 웹 프레임워크입니다. 내부적으로 Project Reactor를 사용하여 HTTP 요청/응답 등 웹 애플리케이션의 리액티브 처리를 지원합니다. WebFlux는 비동기 및 논블로킹 I/O를 통해 높은 확장성을 제공합니다.

WebFlux 예제 코드

(a) Reactor를 사용한 콘솔 애플리케이션 예제

아래 코드는 Reactor의 Flux를 사용하여 1부터 5까지의 숫자를 두 배로 변환 후 출력하는 예제입니다.

// implementation("org.springframework.boot:spring-boot-starter-webflux") < gradle
import reactor.core.publisher.Flux;

public class ReactorExample {
    public static void main(String[] args) {
        // 1. Flux를 생성하여 1부터 5까지의 숫자를 방출합니다.
        Flux<Integer> numbers = Flux.just(1, 2, 3, 4, 5);

        // 2. 각 숫자를 두 배로 변환합니다.
        numbers
            .map(i -> i * 2)
            // 3. subscribe()를 통해 결과 출력, 에러 처리, 완료 메시지 출력
            .subscribe(
                item -> System.out.println("Reactor Result: " + item),  // 데이터 처리
                error -> System.err.println("Error: " + error),           // 에러 처리
                () -> System.out.println("Reactor Completed")             // 완료 메시지 출력
            );
    }
}

(b) WebFlux 기반 REST API 컨트롤러 예제

Spring Boot와 WebFlux를 사용하여 REST API를 구현하는 예제입니다.

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;

@SpringBootApplication
public class WebFluxApplication {
    public static void main(String[] args) {
        SpringApplication.run(WebFluxApplication.class, args);
    }
}

@RestController
class ReactiveController {
    // HTTP GET /numbers 요청에 대해 Flux 스트림을 반환합니다.
    @GetMapping("/numbers")
    public Flux<Integer> getNumbers() {
        // 1부터 5까지의 숫자를 생성하고, 각 숫자를 두 배로 변환하여 반환합니다.
        return Flux.just(1, 2, 3, 4, 5)
                   .map(i -> i * 2);
    }
}

Spring WebFlux의 장단점

  • 장점:
    • Spring 통합: Spring Boot 및 Spring 생태계와의 긴밀한 통합으로 빠른 웹 애플리케이션 개발이 가능
    • 비동기/논블로킹 I/O: Netty, Undertow 등의 서버를 사용해 높은 처리량과 확장성 제공
    • 백프레셔 지원: 데이터 처리 속도 차이가 있는 스트림 환경에서도 안정적인 처리를 지원
  • 단점:
    • 주로 웹 애플리케이션 개발에 최적화되어 있어 범용 비동기 처리는 RxJava보다 제한적일 수 있음
    • 기존 Servlet 기반 애플리케이션에서 전환 시 학습 및 설계 변경이 필요할 수 있음

4. RxJava와 Spring WebFlux 비교 및 선택 기준

두 기술은 모두 리액티브 프로그래밍을 구현하지만, 사용 목적과 환경에 따라 선택 기준이 달라집니다.

  • 사용 목적:
    • RxJava:
      • 범용 비동기 데이터 처리 및 이벤트 스트림 처리
      • 안드로이드 앱이나 데스크탑 애플리케이션 등 웹 이외의 환경에서 사용
    • Spring WebFlux:
      • 리액티브 웹 애플리케이션 및 REST API 서버 개발
      • Spring 생태계를 활용하는 서버 애플리케이션에 최적화
  • 상황별 선택 예시:
    • 모바일 애플리케이션:
      • RxJava를 사용하면 사용자 인터랙션, 네트워크 호출 등 비동기 이벤트를 효과적으로 처리할 수 있습니다.
    • 대규모 REST API 서버 또는 실시간 데이터 스트리밍:
      • Spring WebFlux는 비동기/논블로킹 I/O와 백프레셔 지원으로 높은 동시성 처리가 요구되는 웹 서비스에 적합합니다.
  • 개발 편의성:
    • Spring WebFlux는 Spring Boot와의 통합 덕분에 기존 Spring 기반 프로젝트에 쉽게 도입할 수 있습니다.
    • RxJava는 범용 라이브러리이므로 다양한 플랫폼에서 자유롭게 사용할 수 있지만, Spring과의 통합은 별도의 설정이 필요할 수 있습니다.

5. 마지막으로

리액티브 프로그래밍은 비동기 데이터 스트림 처리에 매우 유용한 패러다임입니다.

  • RxJava는 Java 전반에서 리액티브 기능을 구현하는 범용 라이브러리로, 다양한 환경(안드로이드, 데스크탑 등)에서 사용하기에 적합합니다.
  • Spring WebFlux는 Spring 생태계에 최적화된 리액티브 웹 프레임워크로, 대규모 REST API 서버 및 실시간 웹 애플리케이션 개발에 강점을 가지고 있습니다.
반응형