코드스테이츠_국비교육/[Section4]

69.01_[Spring WebFlux] 리액티브 프로그래밍_22.11.29

생각없이 해도 생각보다 좋다. 2022. 11. 29. 17:18

>명령형 프로그래밍, 선언형 프로그래밍
전통적인 개발 방식(기존) : 명령형 프로그래밍
리액티브 프로그래밍  : 선언형 프로그래밍

>리액티브 시스템이란?
: 클라이언트의 요청에 반응을 잘하는 시스템(요청에 대해 즉각적으로 반응하는 시스템)

>리액티브 시스템 관점에서의 반응이란?
: Thread의 Non-Blocking과 관련있음.
: 리액티브 시스템이 클라이언트의 요청 쓰레드를 차단하지 않음(Non-Blocking)으로써 응답 대기 시간을 최소화한다.

>리액티브 시스템 용어
-MEANS
: 리액티브 시스템에서 사용하는 커뮤니케이션 수단
-FORM
: 메세지 기반 통신을 통해 리액티브 시스템이 어떤 특성을 가지는 구조로 형성되는지를 의미
-VALUE
: 리액티브 시스템의 핵심 가치가 무엇인지를 표현하는 영역

>리액티브 프로그래밍
: 리액티브 시스템에서 사용되는 프로그래밍 모델
: Non-Blocking 통신을 위한 프로그래밍 모델

>리액티브 프로그래밍 특징
-선언형 프로그래밍 방식을 사용

>지속적인 데이터 입력 가능
: data stream을 사용하여 지속적으로 데이터가 입력으로 들어올 수 있음.
: 지속적인 데이터 입력을 데이터의 변경으로 간주고하고, 이를 이벤트로 취급하여 이벤트가 발생할 때마다 데이터를 계속 전달한다.

>리액티브 스트림즈
: 리액티브 스트림즈를 위한 표준 명세(Specification)
: 즉, Interface들로 되어있는 코드이다.

>리애기브 스트림즈 구성요소(Component)
//코드로 작성
1. Publisher
: 데이터 소스로부터 데이터를 내보내는 역할(emit)
: 한 개의 추상 메서드 포함
-subscribe()
: Publisher interface의 메서드
: publicsher가 내보내는 데이터를 수신할 지 여부를 결정.
: subscribe 메서드가 먼저 호출되어야 publisher의 프로세스가 시작되고, 인자로 Subscriber 참조형을 받는다.

2. Subscriber
: Publisher로부터 내보내진 데이터를 소비하는 역할
: 네 개의 추상 메서드 포함
-onSubscribe()
-onNext()
-onError()
-onComplete()

3. Subscription
: 구독이라는 개념 자체를 표현한 인터페이스
: 두 개의 추상 메서드 포함
-request()
-cancel()

4. Processor

>리액티브 스트림즈 구현체
1. Project Reactor
: Spring과 가장 궁합이 잘맞는 대표적인 리액티브 스트림즈 구현체
2. RxJava (rx : reactive extension)
3. Java Flow API
4. 기타 rx

 

>명령형 프로그래밍과 선언형 프로그래밍 차이
: 명령형 프로그래밍은 작성된 코드의 위부터 아래로 순차적으로 실행됨.
: 선언형 프로그래밍은 순차적으로 코드가 실행되지 않음.

대표적인 예시: Stream API
Stream API를 사용할 때, 유의할 점은 최종 연산 메서드가 호출되지 않으면 작성한 메서드 체인이 실행 되지 않는다는 점이 있음.
즉, Stream의 시작부터 중간 연산 메서드는 최종 연산을 위해 어떤 식으로 연산을 진행할 지 적혀있을뿐이고, 실제로는 최종 연산 메서드가 실행된 후 내부적으로 연산이 진행됨을 의미한다.

이처럼 선언형 프로그래밍은 모든 로직을 다 작성하지 않는다.
정말 필요한 동작들은 람다 표현식으로 선언하고, 구체적인 동작 수행은 연산 메서드 체인에 위임한다.


>리액티브 프로그래밍 용어 추가 설명 (Stream으로 연상)
-Publisher
: Stream()과 같이 스트림의 시작을 여는 부분
: 데이터를 내보내는(Emit) 주체(내보낸다는 것이 출력의 의미같음)
-Subscriber
: Publisher가 emit한 데이터를 소비하는 주체
: Stream에서 최종 연산자의 메서드가 이에 해당된다.
-.subscribe()
: Stream에서 최종 연산자의 역할을 하는 부분.
-Signal
: PUblisher가 발생시키는 이벤트를 의미
: 데이터를 emit하는 것(publisher 역할) 자체를 프로그래밍에서는 이벤트로 간주하고, 이를 다른 컴포넌트에 전달하는 것을 Signal을 전송한다고함.
-Operator
: Stream에서 중간 연산자들을 의미
-Sequence
: Stream에서 연산자 체인을 의미
: Publisher부터 시작하여 Operator를 거치고, subscribe하는 것이 하나의 Sequence이다.
-UpStream / Downstream
: Sequence에서 특정 Operator를 기준으로 잡는다면, 해당 Operator 윗 부분은 Upstream, 아랫 부분은 Downstream이라고 하낟.