69DAYS) [Spring WebFlux] 리액티브 프로그래밍 개요 - 리액티브 프로그래밍

nacSeo (낙서)·2023년 1월 26일
0

◉ 학습목표

1. 리액티브 시스템에 대해 알 수 있다.
2. 리액티브 프로그래밍에 대해 알 수 있다.
3. 리액티브 스트림즈에 대해 알 수 있다.
4. 코드를 통해 리액티브 프로그래밍 구조에 대해 알 수 있다.
  1. 리액티브 시스템 (Reactive System)

⦿ 학습목표

☞ 리액티브 시스템

✔︎ 클라이언트의 요청에 반응을 잘하는 시스템

☞ 리액티브 시스템 특징

✔︎ MEANS
: 리액티브 시스템에서 사용하는 커뮤니케이션 수단을 의미

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

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

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

✔︎ VALUE
: 리액티브 시스템의 핵심 가치가 무엇인지 표현하는 영역

  • Responsive
    • 클라이언트 요청에 즉각적으로 응답할 수 있어야 함
  • Maintainable
    • 클라이언트의 요청에 대한 즉각적인 응답이 지속가능해야 함
  • Extensible
    • 클라이언트 요청에 대한 처리량을 자동으로 확장하고 축소할 수 있어야 함
  1. 리액티브 프로그래밍 (Reactive Programming)

⦿ 학습목표

☞ 리액티브 프로그래밍

✔︎ 리액티브 시스템에서 사용되는 프로그래밍 모델

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

✔︎ declarative programming paradigm

  • 선언형 프로그래밍 방식을 사용하는 대표적인 프로그래밍 모델

✔︎ data streams and the propagation of change

  • data streams : 지속적으로 데이터가 입력으로 들어올 수 있음을 의미
  • 데이터가 지속적으로 발생하는 것 자체를 데이터에 어떤 변경이 발생함을 의미
  • 변경 자체를 이벤트로 간주하고, 이벤트가 발생할 때마다 데이터를 계속해서 전달

✔︎ automatic propagation of the changed data flow

  • data stream and the propagation of change와 같은 의미
  • 지속적으로 발생하는 데이터를 하나의 데이터 플로우로 보고 데이터를 자동으로 전달
  1. 리액티브 스트림즈 (Reactive Streams)

⦿ 학습목표

☞ 리액티브 스트림즈

✔︎ 리액티브 프로그래밍을 위한 표준 사양(또는 명세, Specification)

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

✔︎ Publisher

public interface Publisher<T> {
	public void subscribe(Subscribeer<? super T> s);
}
  • 데이터 소스로부터 데이터를 내보내는(emit) 역할
  • 추상 메서드
    • subscribe() : 파라미터로 전달되는 Subscriber가 Publisher로부터 내보내진 데이터를 소비하는 역할

✔︎ Subscriber

public interface Subscsriber<T> {
	public void onSubscribe(Subscription s);
    public void onNext(T t);
    public void onError(Throwable t);
    public void onComplete();
  • Publisher로부터 내보내진 데이터를 소비하는 역할
  • 추상 메서드
    • onSubscribe(Subscription s) : 구독이 시작되는 시점에 호출, onSubscribe() 내 Publisher에게 요청할 데이터의 개수를 지정하거나 구독 해지 처리 가능
    • onNext(T t) : Publisher가 데이터를 emit할 때 호출, emit된 데이터를 전달받아 소비 가능
    • onError(Throwable t) : Publisher로부터 emit된 데이터가 Subscriber에게 전달되는 과정에서 에러가 발생할 경우 호출
    • onComplete() : Publisher가 데이터를 emit하는 과정이 종료될 경우 호출, 데이터의 emit이 정상적으로 완료된 후 처리해야할 작업이 있다면 onComplete() 내에서 수행

✔︎ Subscription

public interface Subsvription {
	public void request(long n);
    public void cancel();
}
  • Subscriber의 구독 자체를 표현한 인터페이스
  • 추상 메서드
    • request(long n) : Publisher가 emit하는 데이터의 개수를 요청
    • cancel() : 구독을 해지하는 역할, 구독 해지 발생시 Publisher는 더이상 데이터를 emit ❌

✔︎ Processor

public interface Processor<T, R> extends Subscriber<T>, Publisher<R> {
}
  • Subscriber 인터페이스Publisher 인터페이스를 상속하고 있기 때문에 역할을 동시에 할 수 있음
  • 별도의 추상 메서드 필요 ❌

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

✔︎ Project Reactor (Reactor)

  • 리액티브 스트림즈를 구현한 대표적인 구현체

✔︎ RxJava

  • .NET 기반의 리액티브 라이브러리를 넷플릭스에서 Java 언어로 포팅한 JVM 기반의 리액티브 확장 라이브러리

✔︎ Java Flow API

  • 리액티브 스트림즈 표준 사양을 Java 안에 포함을 시킨 구조

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

  • 리액티브 스트림즈를 구현한 리액티브 확장 라이브러리 제공
  • RxJava, RxJS, RxAndroid, RxKotlin, RxPython, RxScala 등
  1. 리액티브 프로그래밍 구조

⦿ 학습목표

☞ 선언형 프로그래밍 방식

✔︎ 실행할 코드를 선언만 함, 순차적 실시 ❌
✔︎ 실행 로직을 작성한 코드대로 실행이 되는 명령형 프로그래밍 방식과 달리,
실행 로직의 일부만 람다 표현식으로 전달하며 전달 받은 람다 표현식을 기반으로 Operation 메서드 내부에서 전체 로직을 실행

☞ 리액티브 프로그래밍에서 사용되는 용어 정리

✔︎ Publisher

  • 데이터를 내보내는 주체를 의미

✔︎ Emit

  • Publisher가 데이터를 내보내는 것을 의미

✔︎ Subscriber

  • Publisher가 emit한 데이터를 전달 받아 소비하는 주체를 의미

✔︎ Subscribe

  • 구독을 의미

✔︎ Signal

  • Publisher가 발생시키는 이벤트를 의미

✔︎ Operator

  • 리액티브 프로그래밍에서 어떤 동작을 수행하는 메서드를 의미

✔︎ Sequence

  • Operator 체인으로 표현되는 데이터의 흐름을 의미

✔︎ Upstream / DownStream

  • Seqence 상 특정 Operator를 기준으로 위쪽의 Sequence 일부를 Upstream
  • 아래 쪽 Sequence 일부를 Downstream

◉ 느낀 점

☞ 지금까지 학습한 명령형 프로그래밍 방식과 다르게 선언형 프로그래밍 방식을 사용하면서 코드 구조 자체가 낯설게 느껴졌다. 이전에 스트림에 대해 공부하긴 했지만 아직까지 어색한 느낌 😅 Spring WebFlux에 대한 어려움은 강사님으로부터 듣긴 했다만은 사고 자체를 바꿔 적응하는 데 아직 시간이 걸릴 것 같다. 내일도 학습하면서 좀 더 친해지도록 해야겠다.

◉ 내일의 키워드

・ Project Reactor
・ 마블 다이어그램 & 스케쥴러
・ Operator
profile
백엔드 개발자 김창하입니다 🙇‍♂️

0개의 댓글