Android

[Android] RxJava란?

poppy 2021. 5. 14. 14:12
반응형

오늘은 RxJava가 무엇이고 어떻게 사용하는지에 대해 기본적인 것들만 알아보도록 하겠습니다! RxJava에 관한 내용이 많기 때문에 오늘은 기본적인 개념만 다루고 나중에 추가적으로 필요한 부분은 따로 공부하는 것이 좋을 것 같습니다

RxJava란?

  • RxAndroid 는 RxJava에 안드로이드용 스케쥴러 등 몇 가지 클래스를 추가해 안드로이드 개발을 쉽게 해주는 라이브러리
  • RxJava 는 ReactiveX(Reactive Extensions)를 Java로 구현한 라이브러리

RxJava, RxAndroid는 반응형 프로그래밍(Reative Programming)을 하기 위해 만들어졌습니다. 그럼 반응형 프로그래밍은 무엇일까부터 시작해야겠습니다.

 

반응형 프로그래밍 (Reactive Programming)

 주변 환경과 끊임없이 상호 작용을 하는 프로그래밍을 의미합니다. 환경이 변하면 이벤트를 받아 동작하도록 만드는 프로그래밍 기법입니다. 다음 예시를 보면 이해가 될 것입니다.

 

기존의 명령형 프로그래밍에서는 a=b+c 에서 a는 b+c의 연산이 끝난 이후에 그 결과를 통해 값이 할당됩니다. 만약 이후에 b나 c의 값이 변하더라도 a에는 영향을 주지 않기 때문에 문제가 생길 수 있습니다. 반면 리액티브 프로그래밍에서는 b나 c의 값이 변동되더라도 b+c 연산을 다시 할 필요 없이 자동으로 업데이트됩니다.

 

이제 반응형 프로그래밍에서는 데이터가 변하면 알아서 캐치하여 반영된다는 것을 알 수 있습니다.

반응형 프로그래밍은 시간 순으로 들어오는 모든 데이터의 흐름을 스트림(Stream) 으로 처리합니다. 하나의 데이터 흐름은 다른 데이터 흐름으로 변형되기도 하고, 여러 데이터 흐름이 하나의 데이터 흐름으로 변경될 수도 있습니다.


따라서 RxJava는 데이터를 관찰할 수 있고 데이터를 스트림으로 처리한다는 것을 알 수 있습니다. RxJava는 개발자들이 직면하는 문제들인 동시성 문제, 다중 이벤트 처리, 백그라운드 처리 등의 문제를 좀 더 쉽게 해결할 수 있도록 해줍니다. 안드로이드 개발의 경우 화면(UI)을 변경할 수 있는 것은 메인 쓰레드 뿐이기 때문에 비동기 처리를 해야하는 일이 생깁니다. Rx를 이용하면 이런 작업들을 쉽게 할 수 있고 새로운 프로세스가 추가되어거나 삭제되어야 한다면 로직의 큰 변경 없이 간단히 수정할 수 있습니다.

 

Rx는 다음과 같이 구성되어 있습니다.

RX = Observable + Observers + Schedulers
  • Observable: Observable은 데이터 스트림입니다. Observable은 하나의 스레드에서 다른 스레드로 전달 할 데이터를 압축합니다. 주기적으로 또는 설정에 따라 생애주기동안 한번만 데이터를 방출합니다. Observable은 데이터를 처리하고 다른 구성요소에 전달하는 역할을 한다고 생각하면 됩니다.
  • Observers: Observers는 Observable에 의해 방출된 데이터 스트림을 소비합니다. Observers는 subscribeOn() 메서드를 사용해서 Observable을 구독하고 Observable이 방출하는 데이터를 수신할 수 있다. 
  • Schedulers: Schedulers 는 Observable과 Observers 에게 그들이 실행되어야 할 스레드를 알려줍니다. observeOn() 메서드로 observers에게 관찰해야 할 스레드를 알려줄 수 있다. 또한, scheduleOn() 메서드로 observable이 실행해야 할 스레드를 알려줄 수 있다. 

RxJava 사용하기

먼저 안드로이드 프로젝트에 RxJava를 적용하기 위해서는 build.gradle에 implementaion을 해줘야합니다. 다음 코드를 넣어주면 됩니다.

dependencies {
    implementation 'io.reactivex.rxjava3:rxandroid:3.0.0'
    implementation 'io.reactivex.rxjava3:rxjava:3.0.7'
}

 

Observer 만들기

Observable은 다음의 3가지 이벤트를 사용하여 동작합니다.

 

  • onNext() : 하나의 소스 Observable에서 Observer까지 한 번에 하나씩 순차적으로 데이터를 발행함
  • onComplete() : 데이터 발행이 끝났음을 알리는 완료 이벤트를 Observer에 전달하여 onNext()를 더 호출하지 않음을 나타냄
  • onError() : 오류가 발생했음을 Observer에 전달함
Observer<Integer> observer = new Observer<Integer>() {

    @Override
    public void onCompleted() {
        System.out.println("All data emitted.");
    }
    
    @Override
    public void onError(Throwable e) {
        System.out.println("Error received: " + e.getMessage());
    }
    
    @Override
    public void onNext(Integer integer) {
        System.out.println("New data received: " + integer);
    }
};

 

Scheduler

반응형 프로그래밍에서 scheduler는 동시성을 관리합니다. Scheduler에는 스레드 관리를 제어하는 두개의 메서드가 있습니다.

  • subscribeOn() : observable이 어느 스레드에서 동작할 것인지 정의할 수 있음
  • observeOn() : observer가 어느 스레드에서 동작할 것인지 정의할 수 있음

Schedulers.newThread()와 같이 RxJava에서 제공된 메인 기본 스레드는 새로운 백그라운드를 생성합니다. Schedulers.io() 는 IO 스레드에서 코드를 실행합니다.

 

다음과 같이 Scheduler를 사용할 수 있고 Observer에서 발행하는 데이터를 수신하기 위해서는  꼭! 구독을 해야합니다.

Subscription subscription = observable 
    .subscribeOn(Schedulers.io()) // observable을 IO 스레드에서 실행
    .observeOn(AndroidSchedulers.mainThread()) // Observer 메인 스레드에서 실행
    .subscribe(observer); // observer 구독


subscription.unsubscribe(); // 구독 취소

 

[ 참고 ] 

https://blog.yena.io/studynote/2020/10/11/Android-RxJava(1).html 

 

[Android] RxJava 시작하기

RxJava, RxAndroid 시작하기 안드로이드 개발을 하다보면 언젠가는 RxJava와 만나게 된다. 이미 몇 년 전부터 많은 프론트 개발자들이 사랑사용해 온 라이브러리이기 때문이다. 현재 회사 프로젝트에

blog.yena.io

https://dev-daddy.tistory.com/26

 

RxJava를 사용해서 안드로이드 앱 만들기

원문 : https://medium.com/exploring-code/code-your-next-android-app-using-rxjava-d1db30ac9fcc 이 글은 개인적인 학습과 공유를 목적으로 작성 된 번역 글 입니다. 오타나 오역이 있는 경우, 알려주시면 검..

dev-daddy.tistory.com

 

반응형