RxJava란 무엇?
- RxAndroid 는 RxJava에 안드로이드용 스케쥴러 등 몇 가지 클래스를 추가해 안드로이드 개발을 쉽게 해주는 라이브러리
- RxJava 는 ReactiveX(Reactive Extensions)를 Java로 구현한 라이브러리. Java로 Reactive Programming을 할 수 있는 라이브러리이며, 비동기 프로그래밍과 함수형 프로그래밍 기법을 함께 활용한다.
- ReactiveX: ReactiveX는 관찰 가능한(Observable) 스트림을 사용하는 비동기 프로그래밍을 위한 API이다.
RxJava, RxAndroid는 반응형 프로그래밍(Reative Programming)을 하기 위해 만들어졌습니다. 그럼 반응형 프로그래밍은 무엇일까부터 시작해야겠습니다.
명령형 프로그래밍 vs 반응형 프로그래밍
명령형 프로그래밍(Imperative Programming)
명령형 프로그래밍은 작성된 코드가 순서대로 실행되는 방식의 프로그래밍입니다. 코드가 순서대로 실행되는 것은 개발자가 작성한 조건문, 반복문 또는 함수 호출 등에 의해 컴파일러가 다른 코드로 이동하는 것을 의미합니다.
반응형 프로그래밍 (Reactive Programming)
주변 환경과 끊임없이 상호 작용을 하는 프로그래밍을 의미합니다. 프로그램이 주도하는 것이 아니라 환경(예를 들어 데이터)이 변하면 이벤트를 받아 동작하도록 만드는 프로그래밍 기법.
기존의 명령형 프로그래밍에서는 a=b+c 에서 a는 b+c의 연산이 끝난 이후에 그 결과를 통해 값이 할당됩니다. 만약 이후에 b나 c의 값이 변하더라도 a에는 영향을 주지 않기 때문에 문제가 생길 수 있습니다. 반면 리액티브 프로그래밍에서는 b나 c의 값이 변동되더라도 b+c 연산을 다시 할 필요 없이 자동으로 업데이트됩니다.
출처: https://soohyun6879.tistory.com/123 [코딩기록:티스토리]
자세한 예시는 : https://haero.tistory.com/15 참고
쉽게 말해,
명령형(impereative)은 Pull 방식 : 데이터를 사용하는 곳(Consumer)에서 데이터를 직접 가져와서 사용하는 것이고,
반응형(Reactive)는 Push 방식 : 데이터의 변화가 발생한 곳에서 새로운 데이터를 Consumer에게 전달하는 방식인 것이다.
RX = Observable + Observers + Schedulers
- Observable: Observable은 데이터 스트림입니다. Observable은 하나의 스레드에서 다른 스레드로 전달 할 데이터를 압축합니다. 주기적으로 또는 설정에 따라 생애주기동안 한번만 데이터를 방출합니다. Observable은 데이터를 처리하고 다른 구성요소에 전달하는 역할을 한다고 생각하면 됩니다.
- Observers: Observers는 Observable에 의해 방출된 데이터 스트림을 소비합니다. Observers는 subscribeOn() 메서드를 사용해서 Observable을 구독하고 Observable이 방출하는 데이터를 수신할 수 있다.
- Schedulers: Schedulers 는 Observable과 Observers 에게 그들이 실행되어야 할 스레드를 알려줍니다. observeOn() 메서드로 observers에게 관찰해야 할 스레드를 알려줄 수 있다. 또한, scheduleOn() 메서드로 observable이 실행해야 할 스레드를 알려줄 수 있다.
출처: https://soohyun6879.tistory.com/123 [코딩기록:티스토리]
Rxjava의 필요성
- 만일 정보를 불러온 후 바로 View들이 정보를 업데이트 시켜야한다면? 이를 위해 등장한 것이 Reactive Programming, 반응형 프로그래밍이다.
- RxJava는 데이터를 관찰이 가능하고 데이터를 스트림으로 처리. RxJava는 동시성 문제, 다중 이벤트 처리, 백그라운드 처리 등의 문제를 좀 더 쉽게 해결할 수 있도록 해줍니다. 출처:
RxJava 사용법
RxJava에서는 연산자(Operator)를 통해 기존 데이터를 참조, 변형하여 Observable을 생성하고, 비동기 연산을 필터링, 변환, 조합할 수 있다.
Observable
- 데이터의 변화가 발생하는 데이터 소스로서, 데이터 흐름에 맞게 Consumer에게 알림을 보내는 class
- onNext() : 하나의 소스 Observable에서 Observer까지 한 번에 하나씩 순차적으로 데이터를 발행한다.
- onComplete() : 데이터 발행이 끝났음을 알리는 완료 이벤트를 Observer에 전달하여 onNext()를 더 호출하지 않음을 나타낸다.
- onError() : 오류가 발생했음을 Observer에 전달한다.
subscribe() : Observable은 구독(subscribe)을 해야 데이터가 발행된다.
create() : onNext, onComplete, onError등의 알림을 개발자가 직접 설정(호출)해야 하는 Observable.
Just : 아이템을 그대로 발행하는 Observable을 생성. just()연산자의 인자로 넣은 아이템을 차례로 발행하며, 한 개의 아이템을 넣을 수도 있고, 타입이 같은 여러 아이템을 넣을 수도 있다.
map() : RxJava의 연산자. 데이터를 원하는 형태로 매핑해준다. ex) String to String, String to Integer 등 map() 의 인자로는 변수가 아닌 '어떤 함수'가 들어간다.
출처 : https://velog.io/@ryalya/Android-RxJava%EB%9E%80
[Android] RxJava란?
21.07.05 공부한 것을 정리하는 용도의 글이므로 100% 정확하지 않을 수 있습니다. 참고용으로만 봐주시고, 내용이 부족하다고 느끼신다면 다른 글도 보시는 것이 좋습니다. + 틀린 부분, 수정해
velog.io
LiveData와 RxJava의 공통점
두 라이브러리의 가장 큰 공통점은 옵저버 패턴을 사용해 반응형 프로그래밍을 할 수 있도록 도와준다는 점 입니다. 옵저버 패턴이란, 어떤 이벤트가 발생하는 것을 감지하고 그에 상응하는 대응을 하는 형태로 작성된 패턴을 말합니다. LiveData와 RxJava는 모두 기본적으로 데이터의 변화를 감지하고 그를 통해 미리 작성해 넘겨둔 코드를 통해 UI의 변동 및 비즈니스 로직의 실행을 도와주는 형태입니다.
LiveData와 RxJava의 차이점
- 해지 방법 : LiveData는 lifeCyclerOwner의 생명주기를 인식해 started나 resumed 상태가 되어야만 observable한 상태로 변환되어 데이터 변화를 감지하고, destroyed 이후부터는 참조 상태를 자동으로 해지한다는 것을 알 수 있습니다. 그러나 RxJava는 개발자가 직접 등록하고 해제하는 작업을 거쳐야 하기 때문에 번거로운 점이 있습니다.
- 사용 방법 : LiveData는 databinding을 통해 간단한 코드의 경우 xml에 직접 등록해 사용할 수 있지만, RxJava는 거기까지 지원하지는 않는다는 것입니다. 그래서 RxJava의 경우에는 UI 변경 작업도 각 view(fragment or activity) 코드에서 이루어집니다.
- RxJava의 경우 러닝커브가 매우 큰 편이지만, 큰 러닝커브만큼 지원해주는 기능들이 많습니다. 반대로 LiveData는 그 사용법이 간단한 만큼, 기본적으로 제공해주는 기능에 한계가 존재합니다. 특히 RxJava는 실행 과정에서 subscribeOn이나 observeOn를 통해 어떤 쓰레드에서 실행될 지 결정할 수 있습니다. 하지만 LiveData는 observe 코드 내부에서 직접 코루틴이나 쓰레드를 변경해서 작성해주어야 합니다.
결론 :
- 간단한 로직과 UI 작업은 LiveData를 이용하고 복잡한 비즈니스 로직은 RxJava를 이용하는 것처럼, 두 개의 라이브러리를 적절히 혼용하여 사용하면 더 빠르고 읽기 쉬우며 간단하게 코드를 작성할 수 있을 것 같습니다.