Backend boot camp/Session4
[Spring WebFlux] 리액티브 프로그래밍
by orioncsy
2022. 12. 9.
리엑티브 프로그래밍
개념
Reactive System
- 클라이언트 요청에 반응을 잘하는 시스템을 의미
- 클라이언트에게 응답 대기 시간을 최소화하도록 요청 스레드가 차단되지 않게(Non-Blocking) 하여 즉각 반응하도록 구성된 시스템
Reactive System 설계 원칙
- MEANS
- 커뮤니케이션 수단을 의미
- Message Driven : 메시지 기반 통신을 통해 여러 시스템 간 느슨한 결합 유지
- FORM
- 메시지 기반 통신을 통해 어떤 특성을 가지는 구조로 형성되는지 의미
- Elastic : 요청량에 상관없이 일정한 응답성 유지
- Resillient : 일부분에 장애가 발생하더라도 응답성 유지
- VALUE
- 리액티브 시스템의 핵심 가치
- Responsive : 클라이언트의 요청에 즉각 응답
- Maintainable : 즉각적인 응답이 지속 가능해야 함
- Extensible : 요청에 대한 처리량을 자동으로 확장 및 축소 가능해야 함
리엑티브 프로그래밍
리액티브 프로그래밍의 특징
- declarative programming paradigm
- data streams and the propagation of change
- 지속적으로 데이터가 입력으로 들어올 수 있으며 데이터에 변경이 발생함
- 변경 자체를 이벤트로 간주하고 이벤트 발생마다 데이터 전달
- automatic propagation of the changed data flow
- 지속적으로 발생하는 데이터를 하나의 data flow로 보고 전달
Reactive Streams Component
Reactive Streams 구현체
- Project Reactor
- 줄여서 Reactor라고 부르는데, Spring과 잘 맞는 reactive streams 구현체이다.
- RxJava
- .NET 기반의 리액티브 라이브러리를 넷플릭스에서 Java언어로 포팅한 JVM기반의 리액티브 확장 라이브러리
- Java Flow API
- 리액티브 스트림즈 표준 사양을 Java 안에 포함시킨 구조
- SPI(Service Provider Interface) 역할을 다양한 구현체들이 존재
- Reactive Extension
- Rx(Reactive Extension)
- 다양한 프로그래밍 언어에서 리액티브 스트림즈를 구현한 Rx 라이브러리 제공
- RxJava, RxJS, RxAndroid, RxKotlin, RxPython, RxScala
리엑티브 프로그래밍 구조
명령형 프로그래밍 VS 선언형 프로그래밍
명령형 프로그래밍
- 코드가 어떤 식으로 실행되어야 하는지에 대한 구체적인 로직이 드러난다.
- 예를 들면 For문을 돌아서 if문으로 조건을 보고 작업 수행
선언형 프로그래밍
- Stream API를 사용하여 내부 반복자가 for문을 대체
- filter 메서드는 if문을 대신해 조건을 살핀다.
- stream에 중간 연산에는 이러한 작업을 해달라는 요청만 람다 표현식으로 넘기고 최종 연산이 호출될 때 전달받은 표현식 기반으로 동작 수행
- 필요한 동작들을 개발자가 작성하지 않고 구체적인 동작 수행은 연산 메서드 체인에 위임
리액티브 프로그래밍 용어
Flux
.fromIterable(List.of(1, 2, 4, 8, 9, 11))
.filter(number -> number > 1 && (number % 2 == 0))
.reduce((n1, n2) -> n1 + n2)
.subscribe(System.out::println);
Publisher
- 데이터를 내보내는(emit) 주체를 의미
- Flux가 publisher
Emit
Subscriber
- Publisher가 emit한 데이터를 전달받아서 소비하는 주체
- subscribe(System.out::println)
Subscribe
- 구독을 의미
- subscribe() 메서드 호출
Signal
- Publisher가 발생시키는 이벤트
- subscribe() 메서드가 호출되면 Flux는 숫자 데이터를 하나씩 emit한다.
- 숫자 데이터를 emit 하는 것이 이벤트 발생을 간주하고 이것을 다른 컴포넌트에게 전달하는 것을 signal을 전송한다고 표현
Operator
- 어떤 동작을 수행하는 메서드를 의미
- fromIterable(), filter(0, redue() 등을 operator라고 부른다.
Sequence
- Operator 체인으로 표현되는 데이터의 흐름
Upstream/ DownStream
- sequence 상의 특정 Operation을 기준으로 위쪽 sequence 일부를 Upstream, 아래를 DownStream