본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[RxJava] #1 리액티브 프로그래밍 소개

by 돼지왕 왕돼지 2019. 5. 31.
반응형


callback hell, cold observable, data source, Filter, flatmap, gradle dependency, hot observable, imperative, io.reactivex, map, marble diagram, method reference, observable 클래스, observeon, Observer Pattern, oncomplete, onnext, pipe, pull 방식, pure function, push 방식, race condition, rajava emit, reactive programming, Reactive-Streams, Reduce, rxjava, rxjava 2.0, rxjava deprecate, rxjava helloworld, rxjava just, rxjava netflix, rxjava subscribe, rxjava 공부 방법, rxjava 등장 이유, rxjava 처음 시작하기, rxjava2, side effect, subscribeon, timeline, X, [RxJava] #1 리액티브 프로그래밍 소개, 데드락, 데이터 소스, 데이터 흐름 정의, 데이터 흐름과 전달, 동기화, 디버깅, 리액티브 프로그래밍, 마블 다이어그램, 멀티 스레드, 발행 완료, 스케줄러, 에러, 에러 표시, 옵저버 패턴, 콜백 지옥, 프로그래밍 패러다임, 함수형 프로그래밍


-

RxJava 라이브러리는 1.x 버전을 거쳐 2016년 10월에 점면 개편된 RxJava 2.0 을 출시.





1.1. 리액티브 프로그래밍


-

리액티브 프로그래밍은 데이터 흐름과 전달에 관한 프로그래밍 패러다임.

명령형(imperative) 프로그래밍은 주로 컴퓨터 하드웨어를 대상으로 프로그래머가 작성한 코드가 정해진 절차에 따라 순서대로 실행된다.

그러나 리액티브 프로그래밍은 데이터 흐름을 먼저 정의하고 데이터가 변경되었을 때 연관되는 함수나 수식이 업데이트되는 방식.



-

명령형 프로그래밍 방식은 변경이 발생했다는 통지를 받아서 자료를 다시 가져오는 pull 방식이지만, 리액티브 프로그래밍은 데이터 소스가 변경된 데이터를 함께 주는 push 방식이다.

일종의 옵저버 패턴이다.



-

리액티브 프로그래밍은 1990년대에 제시된 개념이다.

프로그래밍에서 모델(model) 값에 변화가 생겼을 때 뷰(view)를 자동으로 업데이트해주는 목적으로 사용했다.



-

네트워크 프로그래밍의 콜백이나 UI 프로그래밍의 이벤트 클릭 리스터 등도 개념상으로는 리액티브 프로그래밍에 해당한다.

이 전통적인 개념에 여러 가지 요소를 추가해야 RxJava 기반의 리액티브 프로그래밍이 된다.




1.1.1. 자바 언어와 리액티브 프로그래밍


-

자바 언어와 리액티브 프로그래밍은 대략 두 가지 관계가 있다.

1. 기존 pull 방식 프로그래밍 개념을 push 방식의 프로그램 개념으로 바꾼다.

2. 함수형 프로그래밍의 지원을 받는다.



-

콜백이나 옵저버 패턴은 옵저버가 한개이거나 단일 스레드 환경에서는 문제가 없지만 멀티 스레드 환경에서는 사용할 때 많은 주의가 필요하다.

대표적인 예가 데드락과 동기화 문제이다.

함수형 프로그래밍은 부수 효과(side effect)가 없다.

콜백이나 옵저버 패턴이 스레드에 안전하지 않은 이유는 같은 자원에 여러 스레드가 경쟁 조건(race condition)에 빠지게 되었을 때 예측할 수 없는 잘못된 결과가 나오기 때문이다.


함수형 프로그래밍은 순수 함수(pure function)을 지향한다.

따라서 멀티 스레드 환경에서도 안전하다.




1.1.2. 리액티브 프로그래밍 개념 잡기


-

리액티브 프로그램은 주변의 환경과 끊임없는 상호작용을 하는데 프로그램이 주도하는 것이 아니라 환경이 변하면 이벤트를 받아 동작한다. 리액티브 프로그램은 외부 요구에 반응에 맞춰 일하고 대부분 정확한 인터럽트 처리를 담당한다.





1.2. RxJava 를 만들게 된 이유


-

RxJava 는 2013년 2월 넥플릭스(Netflix) 기술 블로그에서 처음으로 소개되었다.

그들이 RxJava 를 만들게 된 핵심적인 이유를 다음과 같이 밝혔다.


1. Embrace Concurrency

2. Java Futures and Expensive to Compose

3. Callbacks have their own problems. ( 콜백이 콜백을 부르는 콜백 지옥, Callback hell )



-

RxJava 2.0 은 RxJava 1.x 를 Reactive-Streams 스펙 기반으로 새롭게 개선한 것이라 공통점도 많고 차이점도 많다.

Reactive-Stream 스펙은 자바 8에 도입된 Stream API 와 Observable 기반의 리액티브 프로그래밍을 포뢀하는 표준 스펙으로 자바 9 에 도입될 예정이다.








1.3. RxJava 처음 시작하기


-

RxJava 를 사용하려면 gradle 기준 ‘io.reactivex.rxjava2:rxjava:2.1.3’ 을 dependency 로 추가해야 한다. ( version 은 latest 로! )



-

HelloWorld 코드

Observable.just(“Hello”, “RxJava 2!!”).subscribe(System.out::println);


실행 결과는..

Hello

RxJava 2!!




1.3.1. io.reactivex




1.3.2. Observable 클래스


-

Observable 클래스는 데이터의 변화가 발생하는 데이터 소스(data source)이다.




1.3.3. just() 함수


-

just() 함수는 가장 단순한 Observable 선언 방식.




1.3.4. subscribe() 함수


-

subscribe() 함수를 호출해야 Observable 에서 데이터가 발행된다.




1.3.5. System.out::println


-

자바 8의 메서드 레퍼런스이다.

메서드 레퍼런스를 사용하지 않으려면 data -> System.out.println(data) 로 써야 한다.




1.3.6. emit() 메서드


-

Observable 이 subscribe() 함수를 호출한 구독자에게 데이터를 발행하는 것을 표현하는 용어이다.





1.4. RxJava 를 어떻게 공부할 것인가


-

다음 학습 순서를 추천한다.

1. Observable 클래스를 명확히 이해한다. 특히 Hot Observable 과 Cold Observable 개념을 꼭 이해해야 한다.

2. 간단한 예제로 map(), filter(), reduce(), flatMap() 함수의 사용법을 익힌다.

3. 생성 연산자, 결합 연산자, 변환 연산자 등 카테고리별 주요 함수를 공부한다.

4. 스케줄러 의미를 배우고 subscribeOn() 과 observeOn() 함수의 차이를 알아 둔다.

5. 그 밖의 디버깅, 흐름 제어 함수를 익힌다.



-

RxJava 1.x 버전은 2017년 6월부터 기능을 더 이상 추가하지 않고, 2018년 3월 31일에는 개발을 중단했다.

RxJava 2 를 공부하는 것이 좋다.



-

자바 8을 꼭 알아야만 리액티브 프로그래밍을 할 수 있는 것은 아니다.

자바 8에서 제공하는 Consumer, Predicate, Function 과 같은 함수형 인터페이스를 자체 구현해서 자바 6 이상이면 동작한다.

하지만 자바 8의 람다 표현식과 함수 레퍼런스를 활용하는 코드는 가독성을 좋게 하므로, 알면 더 좋다.





1.5. 마블 다이어그램 보는 법


-

마블 다이어그램은 RxJava 를 이해하는 핵심 도구.


callback hell, cold observable, data source, Filter, flatmap, gradle dependency, hot observable, imperative, io.reactivex, map, marble diagram, method reference, observable 클래스, observeon, Observer Pattern, oncomplete, onnext, pipe, pull 방식, pure function, push 방식, race condition, rajava emit, reactive programming, Reactive-Streams, Reduce, rxjava, rxjava 2.0, rxjava deprecate, rxjava helloworld, rxjava just, rxjava netflix, rxjava subscribe, rxjava 공부 방법, rxjava 등장 이유, rxjava 처음 시작하기, rxjava2, side effect, subscribeon, timeline, X, [RxJava] #1 리액티브 프로그래밍 소개, 데드락, 데이터 소스, 데이터 흐름 정의, 데이터 흐름과 전달, 동기화, 디버깅, 리액티브 프로그래밍, 마블 다이어그램, 멀티 스레드, 발행 완료, 스케줄러, 에러, 에러 표시, 옵저버 패턴, 콜백 지옥, 프로그래밍 패러다임, 함수형 프로그래밍

1. 위쪽 실선은 Observable 의 시간 표시줄(timeline)이다.

시간순으로 데이터가 발행되는 것을 표현한다.


2. 위쪽 도형들은 Observable 에서 발생하는 데이터이다.

시간 순서대로 별, 삼각형, 오각형, 원 등의 도형을 발행한다.

데이터를 발행할 때는 onNext 알림이 발생한다.


3. 위쪽 우측의 파이프(|) 는 Observable 에서 데이터 발행을 완료했다는 의미이다.

한번 완료하면 이후에는 더 이상 데이터를 발행할 수 없다.

완료하면 onComplete 알림이 발생한다.


4. 아래로 내려오는 점선 화살표는 각각 함수의 입력과 출력 데이터이다. 가운데 박스는 함수를 의미한다.

flip() 함수는 입력값을 뒤집는 함수이다. 따라서 입력값의 색상을 그대로 두고 모양을 위아래 180도 회전하여 뒤집는다.


5. 하단은 함수의 결과가 출력된 시간 표시줄이다.


6. 하단의 엑스(X)는 함수가 입력값을 처리할 때 발생한 에러를 의미한다.

에러 발생 시에는 onError 알림이 발생한다.





1.6. 마치며






반응형

댓글