❯ 리액티브 프로그래밍(Reactive Programming)
리액티브 프로그래밍에서는 선언형 프로그래밍 방식을 사용한다.
Reactive란 사전적으로 "반응하는"의 의미를 가진다.
따라서 리액티브 프로그래밍이란 클라이언트 요청에 반응을 잘하는 시스템을 프로그래밍한다고 생각할 수 있다.
클라이언트 요청에 대한 응답 대기시간을 최소화할 수 있도록 요청 스레드가 차단되지 않게(Non-Blocking) 해서 즉각적으로 반응하도록 한다.
리액티브 시스템의 특징
위 그림은 리액티브 시스템의 설계 원칙을 나타내고있다.
각 용어를 설명하면 다음과 같다.
- Message Driven: 리액트 프로그래밍은 비동기적 메시지 전달을 통해 커뮤니케이션하고, 이를 통해 시스템 간 느슨한 결합을 유지할 수 있다.
- Elastic: 요청의 많고 적음과 상관없이 응답성을 유지한다. 서비스에 할당된 리소스를 늘이거나 줄여서 입력 속도 변화에 대응할 수 있다.
- Resilient: 시스템 장애가 발생해도 응답성을 유지한다. 장애는 각 구성요소에 포함되며 각 구성요소는 서로 격리되어 있으므로 시스템 전체를 손상시키지 않고 일부에 장애가 발생, 이를 복구할 수 있다.
- Responsive: 클라이언트의 요청에 가능한 적시에 응답한다. 문제를 신속하게 감지하고 효과적으로 처리할 수 있다.
❯ 리액티브 스트림즈(Reactive Streams)
리액티브 프로그래밍을 위한 표준사양(Specification)을 의미한다.
[리액티브 스트림즈 컴포넌트]
- Publisher: 데이터 소스로부터 데이터를 내보내는 역할(emit)을 한다. 구현체로는 Mono, Flux 등이 있다.
- Subscriber: Publisher로부터 emit 된 데이터를 소비하는 역할을 한다.
- Subscription: Subscriber의 구독 자체를 표현한 인터페이스이다. emit 하는 데이터 개수를 요청하거나 구독을 해지한다.
- Processor: Subscriber와 Publisher를 상속받아서 두 개의 역할을 동시에 할 수 있다.
리액티브 스트림즈의 구현체로는 Project Reactor, RxJava, Java Flow API 등이 있다.
[리액티브 프로그래밍 구조(예시)]
import reactor.core.publisher.Mono;
// 리액티브 프로그래밍 기본 구조
public class HelloReactiveExample01 {
public static void main(String[] args) {
// (1) Publisher의 역할
Mono<String> mono = Mono.just("Hello, Reactive");
// (2) Subscriber의 역할
mono.subscribe(message -> System.out.println(message));
}
}
위 구조에서 Pulbisher의 역할을 하는 것이 Mono이며 Subscriber의 역할을 하는 것이 message->System.out.println(message) 람다 표현식이다.
위 구조는 아래와 같이 체인 형태로 나타낼 수 있다.
import reactor.core.publisher.Mono;
// 리액티브 프로그래밍 기본 구조
public class HelloReactiveExample02 {
public static void main(String[] args) {
Mono
.just("Hello, Reactive")
.subscribe(message -> System.out.println(message));
}
}
참고자료
'부트캠프 개발일기 > Spring Webflux' 카테고리의 다른 글
71일차: Spring WebFlux (0) | 2023.05.24 |
---|---|
70일차: Reactor(Project Reactor) (0) | 2023.05.23 |