리액티브 시스템 (Reactive System) 이란?
: 클라이언트의 요청에 반응을 잘하는 시스템
= 클라이언트의 요청에 대한 응답 대기 시간을 최소화하기 위해
요청 쓰레드가 차단되지 않도록 함!(Non-Blocking)
➡ 클라이언트에게 즉각적으로 반응하도록 구성된 시스템
리액티브 시스템 설계 원칙
✨ MEANS : 리액티브 시스템에서 사용하는 커뮤니케이션 수단
- Message Driven : 메세지 기반 통신 ➡ 시스템들 간에 느슨한 결합 유지
✨ FORM : 어떤 특성을 가지는 구조로 형성되는지
- Elastic : 시스템 요청량에 상관없이 일정한 응답성 유지
- Resilient : 시스템 일부분에 장애 발생해도 일정한 응답성 유지
✨ VALUE : 리액티브 시스템의 핵심 가치
- Responsive : 클라이언트의 요청에 즉각적으로 응답해야 함
- Maintainable : 클라이언트의 요청에 즉각적 응답 지속가능해야 함
- Extensible : 클라이언트 요청 처리량을 자동 확장, 축소 가능해야 함
리액티브 프로그래밍 (Reactive Programming) 이란?
: 리액티브 시스템에서 사용되는 프로그래밍 모델
: Non-Blocking 통신을 위한 프로그래밍 모델
리액티브 프로그래밍의 특징
1) declarative programming paradigm
: 선언형 프로그래밍 방식 사용
2) data streams and the propagation of change
: 지속적 데이터 입력, 발생 = 데이터에 변경이 발생하는 것
데이터의 변경 = '이벤트' ➡ 이벤트 발생마다 데이터 계속해서 전달
3) automatic propagation of the changed data flow
: 지속적으로 발생하는 데이터 = 하나의 데이터 플로우
데이터를 자동으로 전달함
리액티브 스트림즈 (Reactive Streams) 란?
: 리액티브 프로그래밍을 위한 표준 사양(= 명세)
ex) ORM의 표준사양 ➡ JPA / 데이터베이스 액세스 표준사양 ➡ JDBC
Java - 인터페이스로 어떤 기술의 표준 사양을 코드로 정의함
⬇
리액티브 스트림즈 컴포넌트 (구성요소) : 사양으로 정의된 것들
- Publisher
- Subscriber
- Subscription
- Processor
✨ Publisher : 데이터 소스로부터 데이터를 내보내는(emit) 역할
public interface Publisher<T> {
public void subscribe(Subscriber<? super T> s);
}
subscribe() 추상 메서드 포함 ➡ 호출되지 않으면 Publisher 가 데이터 내보내는 프로세스 시작되지 않는다!
(구독? = Publisher가 내보내는 데이터 수신할지 여부 결정)
✨ Subscriber : Publisher로부터 내보내진 데이터 소비
public interface Subscriber<T> {
public void onSubscribe(Subscription s);
public void onNext(T t);
public void onError(Throwable t);
public void onComplete();
}
네 개의 추상 메서드 포함
- onSubscribe(Subscription s) : 구독 시작 시점에 호출, Publisher에게 요청할 데이터 개수 지정, 구독 해지 처리
- onNext(T t) : 데이터 emit 시 호출, emit 된 데이터 전달받아 소비 가능
- onError(Throwable t) : Publisher ➡ Subscriber emit 데이터 전달과정 중 에러 발생시 호출
- onComplete() : Publisher가 데이터 emit 과정 종료시 호출 (emit 정상 완료 후 처리할 작업 필요시)
✨ Subscription : Subscriber의 구독 자체를 표현
public interface Subscription {
public void request(long n); // Publisher의 emit 데이터 개수 요청
public void cancel(); // 구독 해지 역할 (더이상 데이터 emit X)
}
✨ Processor : Subscriber 인터페이스 + Publisher 인터페이스 상속
* 별도 구현 추상 메서드 無
public interface Processor<T, R> extends Subscriber<T>, Publisher<R> {
}
리액티브 스트림즈의 구현체 :
사양에 맞게 구현된 구현체들
- Project Reactor : 리액티브 스트림즈 대표적인 구현체
- RxJava : .NET 기반 리액티브 라이브러리
- Java Flow API : 리액티브 스트림즈 표준 사양을 Java 안에 포함시킴
- Reactive Extension : 특정 언어에서 리액티브 스트림즈 구현
ex) Rxjava, RxJS, RxAndroid, RxKotlin, RxPython, RxScala
'Spring' 카테고리의 다른 글
[Spring WebFlux] Project Reactor 란? / 마블 다이어그램(Marble Diagram) / 스케쥴러 (Scheduler) / Operators (0) | 2022.11.30 |
---|---|
[Spring Webflux] 리액티브 프로그래밍 구조 / 사용 용어 (0) | 2022.11.29 |
[Spring] Spring MVC 웹 애플리케이션 계층별 개발 흐름 정리 (수정중) (0) | 2022.11.15 |
[Spring] 애플리케이션 빌드 / 실행 / 배포 (0) | 2022.11.15 |
[Spring] API 문서화 - Spring Rest Docs (0) | 2022.11.13 |
댓글