아래 작성한 글은 링크를 참고하여 작성한 글입니다.
그리고, 아래 프로그래밍 코드 예시는 링크를 참고하였습니다.
Reactive Programming 이란?
다양한 비즈니스 요구사항들이 생겨나고 이에 따른 응답 처리가 실시간성이라는 요구사항도 많이 생기게 됨으로써, 비동기(asynchronous)와 논블로킹을 기본으로 데이터의 상태 변경 시 변경되는 작업을 처리할 수 있는 프로그래밍 패러다임이다.
Reactive System 기본 조건
리액티브 프로그래밍을 기반으로 하는 리액티브 시스템은 아래와 같은 4가지 조건을 갖추어야 한다.
- responsive - 일정 시간 내 요청에 대한 응답을 주어야 한다.
- resilent - 랜덤 실패가 발생하더라도 처리 가능해야 한다.
- elastic - 급증하는 트래픽에도 시스템이 죽지 않고 대응할 수 있어야 한다.
- message-driven - 컴포넌트 간 비동기 기반으로 메시지를 주고 받는다.
Reactive Library
Reactive 자바를 RxJava 라고 하는데, 관련 라이브러리는 다음과 같다.
- Reactive Extensions (a.k.a ReactiveX) - 비동기 프로그래밍 api 를 제공하고, RxJava 와 같은 다양한 프로그래밍 언어와 플랫폼을 제공함.
- Project Reactor - Spring Ecosystem 에서 Reactive Stack 위에서 동작하며, JVM 위에 동작하는 논블로킹 어플리케이션 개발 시 사용 (특히, Spring Boot + Spring Webflux 에서 많이 사용)
Reactive Programming 예시
Flux 란? Reactive Streams 에서 메시지를 내보내는 Publisher 역할을 하며, 0 ~ N개 메시지를 내보낼 수 있다.
empty
// TODO Return an empty Flux
Flux<String> emptyFlux() {
return Flux.empty();
}
just
// TODO Return a Flux that contains 2 values "foo" and "bar" without using an array or a collection
Flux<String> fooBarFluxFromValues() {
return Flux.just("foo","bar");
}
fromIterable
// TODO Create a Flux from a List that contains 2 values "foo" and "bar"
Flux<String> fooBarFluxFromList() {
return Flux.fromIterable(Arrays.asList("foo","bar"));
}
error
// TODO Create a Flux that emits an IllegalStateException
Flux<String> errorFlux() {
return Flux.error(new IllegalStateException());
}
counter
// TODO Create a Flux that emits increasing values from 0 to 9 each 100ms
Flux<Long> counter() {
return Flux.interval(Duration.ofMillis(100)).take(10);
}
Mono 란? Reactive Streams 에서 메시지를 내보내는 Publisher 역할을 하며, 0 ~ 1개 메시지를 내보낼 수 있다.
empty
- 비어있는 값을 의미하고, onComplete signal 을 내보낸다.
// TODO Return an empty Mono
Mono<String> emptyMono() {
return Mono.empty();
}
never
- 비어있는 값을 의미하고, signal 을 내보내지 않는다.
// TODO Return a Mono that never emits any signal
Mono<String> monoWithNoSignal() {
return Mono.never();
}
just
- 0 - 1개의 시그널을 내보낼 수 있다.
// TODO Return a Mono that contains a "foo" value
Mono<String> fooMono() {
return Mono.just("foo");
}
error
- 데이터를 처리할 때 예외를 발생시킬 수 있다.
// TODO Create a Mono that emits an IllegalStateException
Mono<String> errorMono() {
return Mono.error(new IllegalStateException());
}
다음 단계에서는 Mono, Flux 가 잘 동작하는지를 체크하는 StepVerifier 에 대해 작성해 볼 예정입니다.