RxJava는 Reactive programming 패러다임을 Java에서 구현한 라이브러리 입니다.
리엑티브 프로그래밍(Reactive programming)이란?
위키피디아 reactive programming정의
1)a declarative programming paradigm concerned with 2)data streams and the propagation of change.
1) 선언적 프로그래밍
2) 변화의 전파와 데이터 흐름(비동기 프로그래밍)
변화의 전파와 데이터 흐름 관점 : 리엑티브 프로그래밍은 데이터가 변경 될 때 마다 이벤트를 발생시켜서 데이터를 계속적으로 전달하는 Push 방식을 따릅니다.
Push 방식(비동기 방식)
데이터의 변화가 발생했을 때 변경이 발생한 곳에서 데이터를 보내주는 방식
- 소켓 프로그래밍
- RTC(Real Time Communication)
- DB Trigger
- Spring의 ApplicationEvent
- Angular의 데이터 바인딩
- 스마트폰의 Push 메시지
Pull 방식(동기 방식)
변경된 데이터가 있는지 요청을 보내 질의하고 변경된 데이터를 가져오는 방식
- client 요청 & server 응답 방식의 애플리케이션
- 절차형 프로그래밍 언어
선언적 프로그래밍 관점: 리엑티브 프로그래밍은 실행할 동작을 구체적으로 명시하는 명령형 프로그래밍과 달리 선언형 프로그래밍으로 단순히 목표를 선언한다.
선언적 프로그래밍(declarative programming)
= 함수형 프로그래밍(funtifunctional programming)
- 컴퓨터가 무엇(what)을 해야하는지 프로그래밍
- 함수형 프로그래밍 언어는 1930년대에 알론조 처치가 개발한 람다 대수에 이론적 기반을 둠
- 함수들로 프로그램이 구성됨
- 각 함수의 실행은 외부에 영향을 주지 않음(pure function인 경우).
- 병렬처리에 매우 유리
- 각 함수의 출력값은 다음 함수의 입력값으로 사용되는 형태로 연결됨
- 각 함수의 작동은 자신의 입력값에 의해 결정됨
- 재귀호출이 매우 자연스럽게 자주 이용되며, 동일한 입력값인 경우 동일한 출력값을 보장하기 때문에 병행 처리나 캐싱등으로 고속화에 유리한 장점이 있음.
- 프로그램이 실제로 어떻게 흘러가는지에 대한 묘사 없이 오직 프로그램의 논리에 초점을 맞춤
- ex) xml, sql, 엑셀, css, Rxjava
// List의 숫자들 중 6보다 큰 홀수들의 합을 구하라
List<Integer> numbers = Arrays.asList(1, 3, 21, 10, 8, 11);
int sum = number.stream()
.filter(number -> number > 6&& % 2 !=0))
.mapToInt(number -> number)
.sum();
System.out.println("선언형 프로그래밍 사용 : " + sum);
명령형 프로그래밍(imperative programming)
= 절차형 프로그래밍(procedural programming)
- 컴퓨터가 어떻게(how) 행동해야 하는지 프로그래밍
- 튜링머신을 반영한 프로그래밍 언어
- 오늘날의 99%가 명령형 프로그래밍
- 명령의 순차적 실행
- 때문에 프로그램의 시작부터 종료까지 수행할 내용(명령)들을 순서대로 나열하거나 특정한 기능을 수행하는 함수에 제어권을 넘겨 수행한 후 해당 결과를 반환받는 형태를 취함.
- 기억 장소 위치를 표현하는 변수의 사용
- 변수의 값을 변경하기 위한 배정문의 사용
- 명령어 언어의 순차적 명령에 의한 실행은 폰 노이만 병목 현상을 불러 일으키게 됨.
- 때문에 많은 자료에 동시 적용될 수 있는 계산, 비결정적인 계산, 혹은 순서에 의존하지 않는 계산을 기술하는데 매우 비효율적.
- ex) c, c++, java, python(혼합), 등..
// List의 숫자들 중 6보다 큰 홀수들의 합을 구하라
List<Integer> numbers = Arrays.asList(1, 3, 21, 10, 8, 11);
int sum = 0;
for(int number : numners){
if(number > 6 && (numner % 2 !=0))){
sum +=number;
}
}
System.out.println("명령형 프로그래밍 사용 : " + sum);
리액티브 프로그래밍을 위해 알아야 될 것들
- Observable : 데이터 소스
- 리액티브 연산자(Operators) : 데이터 소스를 처리하는 함수
- 스케쥴러(Scheduler) : 스레드 관리자
- Subscriber : Observable이 발행하는 데이터를 구독하는 구독자
- 함수형 프로그래밍 : RxJava에서 제공하는 연산자(Operator) 함수를 사용
마블 다이어그램이란?
리액티브 프로그래밍을 통해 발생하는 비동기적인 데이터의 흐름을 시간의 흐름에 따라 시각적으로 표시한 다이어그램
마블 다이어그램을 알아야하는 이유
문장으로 적혀 있는 리액티브 연산자(Operators)의 기능을 이해하기 어려움
리액티브 연산자의 기능이 시각화 되어 있어서 이해하기 쉬움
리액티브 프로그래밍의 핵심인 연산자(Operators)를 사용하기 위한 핵심 도구
kevin 님의 강의에 정리되어있는 추천 자료들
• http://reactivex.io/
리액티브 프로그래밍의 공식 사이트로 리액티브 프로그래밍의 기본기를 다지고 난 후에 참고하기 정말 좋은 사이트라고 생각합니다.
• https://github.com/reactive-streams/reactive-streams-jvm
RxJava는 Reactive Streams를 구현한 구현체라고 할 수 있는데요. 이 Reactive Streams의 스펙을 정의해 둔 github 공식 자료입니다.
• https://gist.github.com/casamia918/93b8db69beb9ee06b92a96b2a234d48e
리액티브 프로그래밍에 대해서 한국어로 잘 번역된 github 자료인데요. 한국어로 번역해주셔서 너무 감사하다는 말씀 전하고 싶네요.
• https://rxmarbles.com/
리액티브 프로그래밍의 핵심중에 핵심이라고 할 수 있는 연산자(Operator)들을 마블 다이어그램으로 잘 정리해 놓은 자료입니다.
• http://reactivex.io/RxJava/2.x/javadoc/
마지막으로 RxJava의 공식 javadoc 문서입니다. 2020년 현재 RxJava 3.0이 릴리즈되었기는 하나 3.0에서는 새로운 연산자 함수들이 많이 추가되었다고 단순하게 생각하시고 2.x 버전으로 개념을 확실히 잡은 다음에 3.0으로 넘어가는 게 좋을 것이라고 생각됩니다.
참고
www.slideshare.net/jongwookkim/ndc14-rx-functional-reactive-programming
www.slideshare.net/deview/1b4-39616041
'Language > Reactive' 카테고리의 다른 글
Processor와 Subject (0) | 2021.04.25 |
---|---|
RxJava로 기존 Android code 개선하기 (0) | 2021.04.25 |
[리액티브 연산자 Operator 2] 에러, 유틸, 조건, 통지 (0) | 2021.04.25 |
[리액티브 연산자 Operator 1] 생성, 필터링, 변환, 결합, (0) | 2021.04.23 |
[리액티브 스트림즈(Reactive Streams)] Publisher, Subscriber, Subscription, Processor 4개 인터페이스 소개 (0) | 2021.04.23 |