-
[RxJava] 넷플릭스가 만든 라이브러리, RxJavaProgramming/RxJava 2020. 8. 16. 14:18
Reactive Extentions(ReactiveX)
ReactiveX는 이벤트 기반 비동기 프로그래밍을 위한 라이브러리이다.
콜백 방식과 달리, 발생하는 이벤트를 이벤트 스트림에 전달하고, 이벤트 스트림을 관찰하다가 원하는 이벤트를 감지하면 이에 따른 동작을 수행하는 방식
RxJava란 무엇인가?
- RxJava는 넷플릭스에서 만든 Reactive Programming 라이브러리다.
- ReactiveX 라이브러리의 JVM 구현체.
- ReactiveX 라이브러리에서 제공하는 기능들을 안드로이드를 포함한 모든 자바 기반 플랫폼에서 사용할 수 있도록 한 것이다.
- RxJava는 함수형 프로그래밍이다.
- Java는 함수형 언어가 아니므로 RxJava 라이브러리는 순수 함수로 작성된 리액티브 연산자를 제공한다.
- 리액티브 연산자를 활용하면 목적을 달성할 수 있는 도구인 '함수형 프로그래밍'방식으로 스레드에 안전한 비동기 프로그램을 작성할 수 있다.
Reactive Programming이란?
- 데이터의 흐름과 전달에 관한 프로그래밍 패러다임.
- 객체 지향 프로그래밍이 패러다임이듯이, 리액티브(반응형) 프로그래밍도 하나의 패러다임이다.
RxJava를 사용하는 이유
- RxJava를 쓰지 않더라도 앱은 잘 작동한다.
- 하지만, RxJava를 사용하면 동일한 기능을 훨씬 더 간결한 코드로 구현할 수 있다.
- 콜백 방식의 문제점을 개선한다.
- 비동기 이벤트를 매우 쉽게 처리할 수 있다.
- 콜백이 콜백을 부르는 상황이 코드의 가독성을 떨어뜨리고 문제 발생 시 디버깅을 어렵 만든다.
- 비동기 방식의 대표적인 예는 CallBack이다. 그래서 RxJava는 콜백을 사용하지 않는 방향으로 설계하여 이를 해결했다.
- 이벤트나 데이터를 쉽게 가공 및 분배할 수 있다.
내가 RxJava 공부를 시작한 이유
- 많은 IT기업에서 RxJava를 도입하고 사용하고 있기 때문
- 코드 개선에 대한 욕구
- 새로운 기술을 습득 욕구
- 초보 입장에서 Reactive Programming에 대한 강력한 도입 필요성은 느끼지 못했다..
- 안드로이드 앱을 개발하면서 반응형 프로그래밍을 적용하며 비동기 프로그래밍을 간결하게 구현할 수 있을 것 같은 기대감(?)
RxAndroid
RxAndroid adds the minimum classes to RxJava that make writing reactive components in Android applications easy and hassle-free.
RxAndroid는 RxJava에 최소한의 클래스를 추가하여 안드로이드 앱에서 리액티브 구성요소를 쉽고 간편하게 사용하게 만드는 라이브러리이다.
Android Application을 개발할 때 가장 큰 어려운 점은 Thread 사용에 있을 것이다.
- 비동기 처리 및 핸들링
- 수많은 핸들러와 콜백으로 인해 발생하는 디버깅 문제
- 2개의 비동기 처리 후 결과 합성
- 이벤트 중복 실행 등..
RxAndroid를 사용함으로써 얻을 수 있는 장점
- 간단한 코드로 복잡한 병행 프로그래밍을 할 수 있다.
- 비동기 구조에서 에러를 다루기 쉽다.
- 함수형 프로그래밍 기법을 부분적으로 적용할 수 있다.
Android에서 비동기 작업을 처리할 때 주로 AsyncTask를 사용하지만 RxJava를 사용하면 Observable에 메인 스레드를 선언할 수 있다.
제품을 코딩할 때 이런 방식을 사용하면 메인 함수만 구현하고, 여기서 구현한 로직만 화면에 그리기 때문에 간단하다는 장점이 있습니다. 또한 함수를 여러 개 만들고 이를 조합해서 어떻게 화면에 보일 것일지만 고민하면 되므로 재사용성이 좋습니다. 다만 학습 비용이 많이 들기 때문에 팀 규모가 큰 경우 도입하지 않을 수 있다는 단점이 있습니다.
RxJava와 Coroutine의 다른 점?
Asynchronous 처리를 도와주는 부분은 동일하다.
그 Asynchronous 처리를 어떠한 형태로 할 것인지가 다를 뿐이다. 이 역시 Thread도 비슷하다.
하지만 하나씩 뜯어보면
- RxJava
- Observable pattern으로 구독
- 구독 후 들어오는 data를 stream 형태로 내려보낸다.
- 중간중간 데이터가 변환되는 걸 stream을 통해 확인 가능하다.
- Coroutines
- 누구나 아는 함수 호출을 하고, return이 오기 전까지 기다린다.
- 처리가 끝나 return 한 데이터를 가지고 다음 처리를 할 수 있다.
- Thread
- 모든 걸 직접 구현해야 한다.
- Listener도 등록해야 하고, Background, UI를 필요할 때마다 구현해야 한다.
- 지저분하고 따라가기 힘들고, 복잡해진다. 데이터 흐름을 쉽게 파악하기 어렵다
마지막 Thread의 단점을 RxJava와 Coroutines은 알아서 해준다.
참고자료
https://github.com/Reactivex/Rxandroid/wiki
https://jeongupark-study-house.tistory.com/133
https://velog.io/@jojo_devstory/Android-RxKotlin-RxAndroid%EB%9E%80-Reactive-Programing
https://academy.realm.io/kr/posts/compose-everything-rx-kotlin/
https://thdev.tech/android/2019/11/30/RxJava-Corotuines-01/
'Programming > RxJava' 카테고리의 다른 글
[RxJava] 4. Filtering & Combining Operator (0) 2020.09.06 [RxJava] 3. Creating & Transforming Operator (0) 2020.09.06 [RxJava] 2. Subject / 생산자 (0) 2020.09.02 [RxJava] 1. Observer Pattern에 대한 이해 (0) 2020.08.16