Java_리액티브 프로그래밍

Minki CHO·2023년 1월 29일
0

CodeStates

목록 보기
30/43

리액티브 프로그래밍

학습목표
:리액티브 프로그래밍이 무엇인지 이해할 수 있다
:리액티브 프로그래밍의 특징을 이해할 수 있다
:리액티브 스트림즈가 무엇인지 이해할 수 있다
:명령형 프로그래밍과 선언형 프로그래밍이 무엇인지 이해할 수 있다
:리액티브 프로그래밍을 학습하기 위한 사전 지식이 무엇인지 이해할 수 있다
:Sprinv MVC 기반의 애플리케이션과 Spring Reactive 기반의 애플리케이션의 차이점을 이해할 수 있다

리액티브

? 리액티브란?
:(in dictionary) 반응하는, 반응을 보이는

=> 리액티브 시스템= 반응을 잘하는 시스템

리액티브 시스템 Reactive System

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

리액티브 시스템의 특징

:리액티브 시스템의 설계 원칙을 그림으로 표현

-MEANS
:리액티브 시스템에서 사용하는 커뮤니케이션 수단
->Message Driven
:리액티브 시스템에서는 메시지 기반 통신을 통해 여러 시스템 간에 느슨한 결합을 유지함<노이해중>

-FORM
:메시지 기반 통신을 통해 리액티브 시스템이 어떤 특성을 가지는 구조로 형성되는지를 의미
->Elastic
:시스템으로 들어오는 요청량에 상관없이(많거나/적거나) 일정한 응답성을 유지하는 것
->Resillient
:시스템의 일부분에 장애가 발생하더라도 응답성을 유지하는 것

-VALUE
:리액티브 시스템의 핵심 가치가 무엇인지 표현하는 영역
->Responsive
:리액티브 시스템은 클라이언트의 요청에 즉각적으로 응답할 수 있어야 함
->Maintainable
:클라이언트의 요청에 대한 즉각적인 응답이 지속적으로 가능해야 함
->Extensible
:클라이언트의 요청에 대한 처리량을 자동으로 확장하고 축소할 수 있어야 함

리액티브 프로그래밍 Reactive Programming

? 리액티브 프로그래밍이란?
:리액티브 시스템에서 사용되는 프로그래밍 모델

-리액티브 시스템에서의 메시지 기반 통신(Message Driven)은 Non-Blocking 통신과 유기적인 관계를 맺고 있음
-리액티브 프로그래밍은 Non-Blocking 통신을 위한 프로그래밍 모델

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

In computing, reactive programming is a 1)declarative programming paradigm concerned with 2)data streams and the propagation of change. With this paradigm, it's possible to express static (e.g., arrays) or dynamic (e.g., event emitters) data streams with ease, and also communicate that an inferred dependency within the associated execution model exists, which facilitates the 3)automatic propagation of the changed data flow.

1) declarative programming paradigm
:리액티브 프로그래밍은 선언형 프로그래밍 방식을 사용하는 대표적인 프로그래밍 모델
(선언형 프로그래밍/명령형 프로그래밍)

2) data streams and the propagation of change
:data streams :지속적으로 데이터가 입력으로 들어올 수 있음을 의미
:리액티브 프로그래밍에서는 (데이터가 지속적으로 발생하는 것 자체) = (데이터에 어떤 변경을 발생함)을 의미
:이 변경 자체를 이벤트로 간주, 이벤트가 발생할 때마다 데이터를 계속해서 전달함

3) authomatic propagation of the changed data flow
:위 설명한 data streams and the propagation of change와 동일 의미
:"지속적으로 발생하는 데이터"를 "하나의 데이터 플로우"로 보고 데이터를 자동으로 전달함

리액티브 스트림즈 Reactive Streams

before
JPA와 JDBC API 공통점
:JPA :java 진영에서 사용하는 ORM(Object-Relational Mapping) 기술의 표준 사양(또는 명세, Specification)
:JDBC :java 애플리케이션에서 데이터베이스에 액세스하기 위한 표준 사양(또는 명세, Specification)

->리액티브 스트림즈란?
:리액티브 프로그래밍을 위한 표준 사양(또는 명세, Specification)

(java에서는 어떤 기술의 표준 사양을 코드로 정의할 경우 일반적으로 java의 인터페이스interface로 정의함)

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

1 Publisher

public interface Publisher<T> {
    public void subscribe(Subscriber<? super T> s);
}

? Publisher 인터페이스란?
:데이터 소스로부터 데이터를 내보내는(emit) 역할

:Publisher 인터페이스는 위 코드와 같이 subscibe() 추상 메서드를 포함
:subscribe() 추상 메서드의 파라미터로 전달되는 Subscriber가 Publisher로부터 내보내진 데이터를 소비하는 역할을 함<노이해중>

? subscribe() 메서드란?
:수신하다 구독하다
:Publisher가 내보내는 데이터를 수신할지 여부를 결정하는 구독의 의미
:일반적으로 subscribe()가 호출되지 않으면, Publisher가 데이터를 내보내는 프로세스 시작되지 않음

Publisher가 데이터를 내보내는 것 = emit 한다

2 Subscriber

public interface Subscriber<T> {
    public void onSubscribe(Subscription s);
    public void onNext(T t);
    public void onError(Throwable t);
    public void onComplete();
}

? Subscriber 인터페이스란?
:Publisher로부터 내보내진 데이터를 소비하는 역할
:네 개의 추상 메서드를 포함

(1)onSubscribe(Subscription s)
:구독이 시작되는 시점에 호출
:onSubscribe() 메서드 내에서 Publisher에게 요청할 데이터의 개수를 지정하거나, 구독 해지 처리할 수 있음

(2)onNext(T t)
:Publisher가 데이터를 emit할 때 호출됨
:emit된 데이터를 전달받아서 소비할 수 있음

(3)onError(Throwable t)
:Publisher로부터 emit된 데이터가 Subscriber에게 전달되는 과정에서 에러가 발생할 경우 호출됨

(4)onComplete()
:Publisher가 데이터를 emit하는 과정이 종료될 경우 호출됨
:데이터의 emit이 정상적으로 완료된 후 처리해야 될 작업이 있다면 onComplete() 내에서 수행할 수 있음<노이해중>

3 Subscription

public interface Subscription {
    public void request(long n);
    public void cancel();
}

? Subscription 인터페이스란?
:Subscriber의 구독 자체를 표현한 메서드
:각 메서드의 역할은 아래와 같음

(1)request(long n)
:Publisher가 emit하는 데이터의 개수를 요청함

(2)cancel()
:구독을 해지하는 역할을 함
:구독 해지 발생 시 Publisher는 더이상 데이터를 emit하지 않음

4 Processor

public interface Processor<T, R> extends Subscriber<T>, Publisher<R> {
}

? Processor 인터페이스란?
:Subscriber 인터페이스와 Publisher 인터페이스를 상속함
:따라서 Publisher와 Subscriber 역할을 동시에 할 수 있음
:별도로 구현해야 되는 차상 메서드는 없음

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

:리액티브 스트림즈가 리액티브 프로그래밍을 위한 사양
:따라서 사양에 맞게 구현된 구현체가 존재할 것

리액티브 스트림즈의 구현체는 무엇이 있을까

1 Project Reactor
:줄여서 Reactor
:리액티브 스트림즈를 구현한 대표적인 구현체
:Spring과 궁합이 가장 잘 맞는 리액티브 스트림즈 구현체

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

3 Java Flow API

4 기타 리액티브 확장 Reactive Extension

profile
Developer

0개의 댓글