리액티브 프로그래밍은 비동기 데이터 흐름 및 이벤트 기반 프로그래밍을 구현하는 패러다임입니다. 데이터를 스트림 형태로 다루며, 시간이 지남에 따라 발생하는 이벤트를 처리합니다. 자바에서는 Reactor와 RxJava 같은 라이브러리를 통해 리액티브 프로그래밍을 구현할 수 있습니다.
---
자바에서 리액티브 프로그래밍의 핵심 개념
1. Publisher와 Subscriber
Publisher: 데이터를 발행하는 역할. (e.g., Flux, Mono)
Subscriber: 데이터를 구독하여 처리하는 역할.
이 둘은 Reactive Streams 표준 인터페이스를 따릅니다.
2. Mono와 Flux (Project Reactor 기준)
Mono: 최대 하나의 데이터를 처리하는 Publisher.
Mono<String> mono = Mono.just("Hello, Reactive World!");
Flux: 0개 이상의 데이터를 처리하는 Publisher.
Flux<Integer> flux = Flux.range(1, 5);
3. 연산자(Operators)
데이터 스트림을 변환하거나 필터링하는 함수형 API를 제공합니다.
map: 데이터를 변환.
filter: 조건에 따라 데이터를 걸러냄.
flatMap: 비동기 작업과 함께 데이터를 변환.
---
예시 1: Mono와 Flux 사용
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
public class ReactiveExample {
public static void main(String[] args) {
// Mono: 하나의 값 처리
Mono<String> mono = Mono.just("Hello, Mono!");
mono.subscribe(System.out::println);
// Flux: 여러 값 처리
Flux<Integer> flux = Flux.range(1, 5)
.map(i -> i * 2) // 값을 두 배로 변환
.filter(i -> i % 3 == 0); // 3의 배수만 필터링
flux.subscribe(System.out::println);
}
}
---
예시 2: 비동기 데이터 처리
import reactor.core.publisher.Flux;
import java.time.Duration;
public class ReactiveAsyncExample {
public static void main(String[] args) throws InterruptedException {
// 비동기로 1초마다 값을 생성
Flux.interval(Duration.ofSeconds(1))
.map(i -> "Tick: " + i)
.take(5) // 5개의 값만 처리
.subscribe(System.out::println);
// 메인 쓰레드 대기 (비동기 실행 확인용)
Thread.sleep(6000);
}
}
---
예시 3: WebFlux와 함께 사용
Spring WebFlux 환경에서는 리액티브 프로그래밍을 통해 웹 요청 및 응답을 비동기로 처리할 수 있습니다.
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import java.time.Duration;
@RestController
public class ReactiveController {
@GetMapping("/mono")
public Mono<String> getMono() {
return Mono.just("Hello, WebFlux with Mono!");
}
@GetMapping("/flux")
public Flux<String> getFlux() {
return Flux.interval(Duration.ofSeconds(1))
.map(i -> "Value: " + i)
.take(5); // 5개의 값만 반환
}
}
---
리액티브 프로그래밍의 장점
효율적인 자원 사용: 비동기 및 논블로킹 방식으로 시스템 성능 극대화.
간결한 코드: 데이터 변환과 처리를 함수형 방식으로 간단히 구현.
대규모 동시성 처리: 많은 데이터를 빠르고 효율적으로 처리 가능.