키워드
리액티브 프로그래밍 : 반응형 프로그래밍. 클라이언트의 요청에 반응을 잘하는 시스템
리액티브 스트림즈 :
명령형 프로그래밍 : 전통적인 프로그래밍 방식 ex) Spring MVC 기반 애플리케이션
선언형 프로그래밍 : 리액티브 프로그래밍 방식
리액티브 프로그래밍이란? (개념 부분)
: 클라이언트의 요청에 반응을 잘하는 시스템
: 쓰레드가 차단되지 않게 함(Non-Blocking)으로써 클라이언트에게 즉각적으로 반응하도록 구성된 프로그래밍 모델
Non-blocking 통신은 리액티브 시스템에서 메세지 기반 통신(Message Driven)과 유기적인 관계를 맺음
: Data Streams로 인한 지속적인 데이터 변경 자체를 이벤트로 간주하고, 이벤트 발생마다 데이터를 계속 전달함
* data streams
: 지속적으로 데이터가 입력으로 들어올 수 있음을 의미
: 즉, 데이터가 지속적으로 발생한다는 것은 데이터에 어떤 변경이 계속 발생한다는 뜻
리액티브 시스템 설계 원칙 (개념 부분)
1. MEANS : 리액티브 시스템에서 사용하는 커뮤니케이션 수단을 의미
Message driven : 리액티브 시스템에서는 메세지 기반 통신을 통해 여러 시스템간에 느슨한 결합을 유지함
2. FORM : 메세지 기반 통신을 통해 리액티브 시스템이 어떤 특성을 가지는 구조로 형성되는지를 의미
Elastic : 시스템으로 들어오는 요청량의 다소에 상관없이 일정한 응답성을 유지하는 것을 의미
Resillient : 시스템의 일부분에 장애가 발생하더라도 응답성을 유지하는 것을 의미
3. VALUE : 리액티브 시스템의 핵심 가치가 무엇인지를 표현하는 영역
Responsive : 리액티브 시스템은 클라이언트 요청에 즉각저그올 응답할 수 있어야함을 의미
Maintainable : 클라이언트의 요청에 대한 즉각적인 응답이 지속가능해야 함을 의미
Extemsible : 클라이언트의 요청에 대한 처리량을 자동으로 확장하고 축소할 수 있어야 함을 의미
리액티브 스트림즈란? (개념 부분)
: 리액티브 프로그래밍을 위한 표준 사양(Specification)
: 사양이므로 => 구현체가 반드시 존재해야함 (ex)) Project Reactor, RxJava등)
* JPA : Java진영에서 사용하는 ORM(객체-관계 매핑)기술의 표준 사양
* JDBC : Java 앱에서 DB에 액세스하기 위한 표준 사양
* 자바에선 어떤 기술의 표준 사양을 코드로 정의할 경우, 일반적으로 인터페이스(Interface)로 정의
* 공식문서 : https://github.com/reactive-streams/reactive-streams-jvm
리액티브 스트림즈 컴포넌트 (인터페이스 구현 부분)
publisher 인터페이스 : 데이터 소스로부터 데이터를 내보내는 역할(emit)
1. subscribe() : 이 메서드가 호출되어야 Publisher가 데이터를 내보내는 프로세스가 시작됨
public interface Publisher<T> {
public void subscribe(Subscriber<? super T> s);
}
Subscriber 인터페이스 : 내보내진 테이터를 소비하는 역할
1. onSubscribe(Subscription s) : 구독 시작시점에 호출. Publisher에 요청할 데이터의 개수를 지정하거나 구독해지
2. onNext(T t) : Publisher가 데이터를 emit할 떄 호출. emit된 데이터를 전달받아서 소비
3. onError(Throwable t) : Publisher로부터 emit된 데이터가 Subscriber에게 전달되는 과정에서 에러발생시 호출
4. onComplete() : Publisher가 데이터를 emit하는 과정이 종료된 경우 호출.
: 데이터의 emit이 정상적으로 완료된 후 처리해야 할 될 작업이 있다면 onComplete() 내에서 수행 가능
public interface Subscriber<T> {
public void onSubscribe(Subscription s);
public void onNext(T t);
public void onError(Throwable t);
public void onComplete();
}
Subscription 인터페이스 : 구독 자체
1. request(long n) : Publisher가 emit하는 데이터의 개수를 요청
2. cancel() : 구독을 해지하는 역할
public interface Subscription {
public void request(long n);
public void cancel();
}
Processer 인터페이스 : Sebscriber와 Publisher를 상속받아, 두 역할을 동시에 수행할 수 있음
: 별도로 구현할 추상 메서드 없음
public interface Processor<T, R> extends Subscriber<T>, Publisher<R> {
}
리액티브 스트림즈의 구현체
: 리액티브 스트림즈(사양)에 맞게 구현된 구현체
: 종류로 Project Reactor(=Reactor), RxJava, Java Flow API 등
1. Project Reactor (Reactor)
: Spring과 궁합이 가장 잘 맞는 구현체
: Spring 5의 리액티브 스택에 포함되어 있으며, Spring Reactive Application 구현의 핵심역할
2. RxJava (Reactive Extension)
: .NET 기반의 리액티브 라이브러리를 넷플릭스에서 Java언어로 포팅한 JVM 리액티브 확장 라이브러리
: 2.0부터 리액티브 스트림즈 사양을 준수
3. Java Flow API
: Java 9 부터 리액티브 스트림즈 지원
: 리액티브 스트림즈 구현체라기보단, 리액티브 스트림즈 사양을 Java 안에 포함시킨 구조
: 리액티브 스트림즈의 여러 구현체들에 대한 SPI (Service Provider Interface) 역할
4. 기타 Reactive Extension(RxJava)들
: RxJS, RxAndroid, RxKotlin, RxPython, RxScala 등
* 리액티브 확장(Extension) 공홈 : https://reactivex.io/
'Codestates [Back-end] > 데일리 로그 [TIL]' 카테고리의 다른 글
22.10.12 Spring Webflux - ProjectReactor / 마블 다이어그램 (0) | 2022.10.12 |
---|---|
22.10.12 Spring WebFlux - 기본 코드 구조 / MVC vs WebFlux (0) | 2022.10.12 |
22.10.11 Cloud 운영 전략 - 웹 서버 (TOMCAT / Jetty / Nginx / Load balancer) (0) | 2022.10.11 |
22.10.11 Cloud 운영전략 - 프록시 서버 / 로드 밸런서 / 오토 스케일링 (0) | 2022.10.11 |
22.10.06 Cloud - 배포 자동화 [Step 3. 서버 환경 변수 설정] (0) | 2022.10.07 |