본문 바로가기
부트캠프 개발일기/Spring Webflux

69일차: 리액티브 프로그래밍

by shyun00 2023. 5. 22.

리액티브 프로그래밍(Reactive Programming)

리액티브 프로그래밍에서는 선언형 프로그래밍 방식을 사용한다.

Reactive란 사전적으로 "반응하는"의 의미를 가진다. 

따라서 리액티브 프로그래밍이란 클라이언트 요청에 반응을 잘하는 시스템을 프로그래밍한다고 생각할 수 있다.

클라이언트 요청에 대한 응답 대기시간을 최소화할 수 있도록 요청 스레드가 차단되지 않게(Non-Blocking) 해서 즉각적으로 반응하도록 한다.

리액티브 시스템의 특징

이미지 출처: https://www.reactivemanifesto.org/

위 그림은 리액티브 시스템의 설계 원칙을 나타내고있다.

각 용어를 설명하면 다음과 같다.

  • 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));
    }
}

 

참고자료

https://www.reactivemanifesto.org/

'부트캠프 개발일기 > Spring Webflux' 카테고리의 다른 글

71일차: Spring WebFlux  (0) 2023.05.24
70일차: Reactor(Project Reactor)  (0) 2023.05.23