[Spring WebFlux] 리액티브 프로그래밍

·2022년 11월 29일
0

WebFlux

목록 보기
1/2
post-thumbnail

리액티브(Reactive)⛷️


리액티브는 사전적인 의미대로 반응을 하는 의미를 가진다.

리액티브 시스템(Reactive System)

: 반응을 잘하는 시스템, 해당 시스템을 이용하는 클라이언트의 요청에 반응을 잘하는 시스템을 의미한다.

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

🧐 Blocking 과 Non-Blocking
둘은 함수를 호출하고 결과를 기다리는 동안에 함수를 호출하는 프로그램 상태를 의미한다.
Blocking : 결과값을 얻기 전에 현재 스레드를 정지시킨다. 즉, 결과 값을 받을 때까지 아무것도 하지 않는 상태가 된다.
Non-Blocking : 함수를 호출하고 스레드가 정지되지 않아 결과 값을 받을 때까지 다른 작업을 수행할 수 있다.

리액티브 시스템의 특징


[리액티브 시스템 설계 원칙]

MEANS

: 리액티브 시스템에서 사용하는 커뮤니케이션 수단

  • Message Driven : 메세지 기반 통신을 통해 여러 시스템간에 느슨한 결합을 유지

FORM

: 메세지 기반 통신을 통해 리액티브 시스템이 어떤 특성을 가지는 구조로 형성되는지를 의미

  • Elastic : 시스템으로 들어오는 요청량에 상관없이 일정한 응답성을 유지하는 것
  • Resillient : 시스템의 일부분 장애가 발생하더라도 응답성을 유지하는 것

VALUE

: 리액티브 시스템의 핵심 가치를 표현하는 영역

  • Responsive : 클라이언트의 요청을 즉각적으로 응답해야 한다.
  • Maintainable : 클라이언트의 요청에 대한 즉각적인 응답이 지속 가능해야 한다.
  • Extensible : 클라이언트의 요청에 대한 처리량을 자동으로 확장하고 축소할 수 있어야 한다.

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

리액티브 시스템에서 사용되는 선언형 프로그래밍 모델.

💡 리액티브 시스템에서의 메세지 기반 통신은 Non-Blocking통신과 유기적인 관계를 맺고 있으며, 리액티브 프로그래밍은 그 Non-Blocking 통신을 위해 존재한다.

리액티브 프로그래밍의 특징

  • 선언형 프로그래밍 방식을 사용한다.
  • 지속적으로 데이터가 입력으로 들어올 수 있다.
  • 데이터가 지속적으로 발생하는 것 자체를 하나의 데이터 플로우로 보고 데이터를 자동으로 전달한다.
  • 데이터의 어떤 변경을 이벤트로 간주하고, 이벤트가 발생할 때마다 데이터를 계속해서 전달한다.

리액티브 프로그래밍에서 사용하는 용어

  • Publisher : 데이터를 내보내는 주체를 의미
  • Emit : Publisher가 데이터를 내보내는 것
  • Subscriber : Publisher가 emit한 데이터를 전달 받아서 소비하는 주체
  • Subscribe : 구독
  • Signal : Publisher가 발생시키는 이벤트
  • Operator : 리액티브 프로그래밍에서 어떤 동작을 수행하는 메서드(연산)
  • Sequence : Operator 체인으로 표현되는 데이터의 흐름
  • Upstream / Downstream : 특정 Operator을 기준으로 위쪽의 Sequence 일부를 Upstream이라고 하고 Downstream은 그 반대의 개념

리액티브 스트림즈(Reactive Stream)

리액티브 프로그래밍을 위한 표준 사양

리액티브 스트림즈 컴포넌트

Publisher

데이터 소스로 부터 데이터를 내보내는(emit) 역할을 담당한다.

해당 인터페이스에 포함된 subscribe() 추상 메서드는 파라미터로 Subscriber를 받는데 이것은 Publisher로 부터 내보내진 데이터를 소비하는 역할을 한다.

subscribe() 추상 메서드는 Publisher가 내보내는 데이터를 수신할 지에(구독)대한 여부를 결정하는 메서드로, 해당 메서드가 호출되지 않으면 Publisher가 데이터를 emit하는 프로세스는 시작되지 않는다.

🧐 구독.. 데이터를 생성하고 발행하는 것이라고 이해

Subscriber

Publisher로부터 내보내진 데이터를 소비하는 역할로 데이터를 전달받아 처리한다.

  • onSubscribe(Subscription s) : 구독이 시작되는 시점(데이터를 최초 통지할 때)에 호출되는 메서드로 Subscription객체로 데이터의 구독 요청 및 해지 요청을 처리한다.
  • onNext(T t) : 데이터를 emit할 때 호출되며 emit된 데이터를 전달받아 소비하는 메서드
  • onError(Throwable t) : emit된 데이터가 Subscriber에 전달되는 과정에서 에러가 발생할 경우 호출되는 메서드
  • onComplete() : 데이터를 emit하는 과정이 종료될 경우 호출되는 메서드로 데이터의 emit이 정상적으로 완료된 후, 처리해야 될 작업을 해당 메서드 내에서 수행한다.

Subscription

Subscriber의 구독 자체를 표현한 인터페이스로 emit된 데이터의 개수를 요청하고 구독을 해지하는 역할을 한다.

  • request(long n) : Publisher가 emit하는 데이터의 개수를 요청하는 메서드
  • cancel() : 구독을 해지하는 메서드

🧐 구독 해지...
Publisher가 더이상 데이터를 emit하지 않는 것을 의미

Processor

Subscriber 인터페이스와 Publisher 인터페이스를 상속하고 있기 때문에 Publisher와 Subscriber의 역할을 동시에 할 수 있는 특징을 가진다.

리액티브 스트림즈 통신 흐름

중간 Subscription이 존재한다는 것을 잊지말좌!👊

리액티브 스트림즈의 구현체

  • Project Reactor

  • RxJava

  • Java Flow API

  • 기타 리액티브 확장(Reactive Extension)

profile
🧑‍💻백엔드 개발자, 조금씩 꾸준하게

0개의 댓글