리액티브 프로그래밍은 비동기 데이터 스트림과 이벤트 흐름을 처리하는 새로운 패러다임입니다.
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:
- 상황별 선택 예시:
- 모바일 애플리케이션:
- RxJava를 사용하면 사용자 인터랙션, 네트워크 호출 등 비동기 이벤트를 효과적으로 처리할 수 있습니다.
- 대규모 REST API 서버 또는 실시간 데이터 스트리밍:
- Spring WebFlux는 비동기/논블로킹 I/O와 백프레셔 지원으로 높은 동시성 처리가 요구되는 웹 서비스에 적합합니다.
- 모바일 애플리케이션:
- 개발 편의성:
- Spring WebFlux는 Spring Boot와의 통합 덕분에 기존 Spring 기반 프로젝트에 쉽게 도입할 수 있습니다.
- RxJava는 범용 라이브러리이므로 다양한 플랫폼에서 자유롭게 사용할 수 있지만, Spring과의 통합은 별도의 설정이 필요할 수 있습니다.
5. 마지막으로
리액티브 프로그래밍은 비동기 데이터 스트림 처리에 매우 유용한 패러다임입니다.
- RxJava는 Java 전반에서 리액티브 기능을 구현하는 범용 라이브러리로, 다양한 환경(안드로이드, 데스크탑 등)에서 사용하기에 적합합니다.
- Spring WebFlux는 Spring 생태계에 최적화된 리액티브 웹 프레임워크로, 대규모 REST API 서버 및 실시간 웹 애플리케이션 개발에 강점을 가지고 있습니다.
'Spring' 카테고리의 다른 글
[Spring] Restclient > proxy guide (1) | 2025.04.24 |
---|---|
Spring MVC의 DispatcherServlet: 핵심 개념과 역할 (0) | 2024.12.24 |
Spring Boot Run: 내부 동작 과정과 Bean 등록 (0) | 2024.12.23 |
Java Spring MVC에서 ArgumentResolver (0) | 2024.12.22 |
Spring 디자인 패턴: 팩토리 메소드 패턴 vs 템플릿 메서드 패턴 (2) | 2024.12.19 |