프로젝트를 진행하면서 서버와의 통신을 구현하던 중 비동기 처리에 무엇을 사용할까 고민 중에 RxJava를 사용하기로 하였다. 그 이유는 다음과 같다.
1. 비동기 이벤트를 매우 쉽게 처리 가능
2. REST API 통신 라이브러리인 Retrofit과의 뛰어난 호환성
3. 간결한 코드 및 콜백 지옥 탈출
위 세가지 이유 외에도 많은 IT 기업에서 안드로이드 개발자 채용 시 RxJava 사용 경험이 있는 개발자를 우대하고 있으며, 새로운 기술을 습득하고자 하는 욕구에서 RxJava를 공부해보기로 했다.
본 포스팅은 옥수환님이 저자인 책 '아키텍처를 알아야 앱 개발이 보인다'에서 RxJava 파트를 공부하여 정리한 것이다.
1. RxJava란?
RxJava란 Reactive X (Reactive Extensions)를 자바로 구현한 라이브러리다.
이벤트 처리 및 비동기 처리의 구성에 최적화돼 있다.
Reactive X란 Microsoft사 주도 아래 옵저버 패턴, 이터레이터 패턴, 함수형 프로그래밍의 장점과 개념을 접목한 반응형 프로그래밍 기법이다.
2. 반응형 프로그래밍이란?
반응형 프로그래밍이란 주변 환경과 끊임없이 상호 작용을 하는 프로그래밍을 의미한다.
즉 프로그램이 주도하는 것이 아닌 환경이 변하면 이벤트를 받아 동작하도록 만드는 기법이다.
반응형 프로그래밍을 사용하면 외부 요구에 끊임없이 반응하고 처리가 가능하다.
기존의 프로그래밍 방식은 명령형 프로그래밍이라고 한다.
반응형 프로그래밍과 명령형 프로그래밍의 차이를 알아보자.
반응형 프로그래밍
- 시간순으로 들어오는 모든 데이터의 흐름을 스트림으로 처리
- 하나의 데이터 흐름은 다른 데이터 흐름으로 변형 가능
- 여러 데이터 흐름이 하나의 데이터 흐름으로 변경 가능
명령형 프로그래밍
- 작성된 코드가 정해진 순서대로 실행되는 방식의 프로그래밍
- 이해하기 쉬움
3. RxJava를 배워야 하는 이유
그렇다면 RxJava를 왜 배워야 하는가? RxJava를 배우면 다음과 같은 이점이 있다.
1. 동시성 문제, 다중 이벤트 처리, 백그라운드 스레드 처리 등에 확실한 해결책을 제시
2. 기존에 작성한 비즈니스 로직에 새로운 프로세스가 추가되어야 하는 경우 큰 리팩토링 없이 변경사항 구현 가능
3. 네트워크 관련 대기 및 재시도 작업과 같은 예외 사항 추가 쉬움
RxJava는 모든 문제를 체이닝 가능한 연산자 단위로 처리하므로 기능을 추가하거나 제거가 쉽다.
4. 마블 다이어그램
위 도표는 마블 다이어그램이라고 하며, 반응형 프로그래밍에서 일어나는 비동기적인 데이터 흐름을 시각화한 도표이다.
RxJava 연산자들은 모두 마블 다이어그램으로 표현이 돼있으므로 각 기호들이 무슨 의미를 뜻하는 것인지 알면 동작 원리를 이해하는데 도움이 된다.
마블다이어그램의 각 번호들을 해석하면 다음과 같다.
1. Observable의 타임 라인, 왼쪽에서 오른쪽으로 시간이 흐름을 의미
2. Observable이 순차적으로 발행하는 데이터를 의미
3. Observable이 정상적으로 완료됨을 의미
4. 점선과 박스는 Observable의 변형을 의미, 박스 안의 텍스트가 변형의 종류를 의미
5. Observable의 변형 결과를 의미
6. 만약 Observable이 정상적으로 종료되지 않았다면 X 표시와 함께 에러를 나타냄
5. RxJava 구성 요소
뒤에서 자세히 다루겠지만, 간단하게 RxJava를 구성하는 요소들에 대해 알아보자.
Observable
- 데이터 스트림
- 하나의 스레드에서 다른 스레드로 전달할 데이터를 압축
- 주기적으로 또는 설정에 따라 생애주기 동안 한 번만 데이터를 방출
- 즉, 데이터를 처리하고 다른 구성요소에 전달하는 역할을 함
Observers
- Observable에 의해 방출된 데이터 스트림을 소비
- Observable을 구독(subscribe)하여 방출하는 데이터를 수신할 수 있음
Schedulers
- Observable과 Observers이 실행되어야 할 스레드를 알려줌
이외에도 다양한 연산자, Subject, Flowable 등이 있지만 뒤에서 다루기로 하겠다.
6. RxJava 설정
안드로이드에서 RxJava를 사용하기 위해서는 모듈(앱) 레벨의 build.gradle 파일에 의존성을 추가한다.
2022년 2월 9일 기준 RxJava 최신 버전은 3.1.3이다.
dependencies {
implementation "io.reactivex.rxjava3:rxjava:3.x.y"
implementation "io.reactivex.rxjava3:rxandroid:3.x.y"
implementation "io.reactivex.rxjava3:rxkotlin:3.x.y"
}
RxJava의 최신 버전은 ReactiveX / RxJava에서 확인할 수 있다.https://github.com/ReactiveX/RxJava
다음 포스팅에서는 Observable에 대해 다루도록 하겠다.
참고
도서 '아키텍처를 알아야 앱 개발이 보인다' 옥수환 저