요즘 신입 채용 조건에 RxJava
사용 경험이 많이 포함되어 있다. 옆에서 주워들은 조언으로 Rx는 신입 기준으로 마스터하기엔 힘든 라이브러리이며 "우리 회사에서 Rx를 사용하니 한번 뭔지 알아는 와라"라는 뜻이라고 한다. 그러니 편한 마음으로 RxJava를 알아보자
RxJava란?
Rx는 ReactiveX
의 약자로 Rxjava는 명령형 프로그램인 Java 언어 방식을 반응형 프로그래밍으로 사용할 수 있게끔 도와주는 라이브러리이며 이벤트에 대해서 조건 처리하거나, 조합하거나 오류를 처리 하는등 복잡한 비동기 연산에 대해 효율성을 높여준다. 반응형 프로그래밍이라고 정의하면 낯설어 할 수 있는 데 우리는 이미 반응형 프로그래밍과 유사한 코드를 경험해 보았다. Button의 클릭 이벤트, 클래스간 인터페이스를 활용한 Callback 등이 있다.
HelloWorld RxJava
import io.reactivex.rxjava3.core.Flowable;
public class HelloWorld {
public static void main(String[] args) {
Flowable.just("Hello", "Rxjava").subscribe(System.out::println);
}
}
//출력
Hello
Rxjava
Rx는 데이터를 스트림 형식으로 표현한다. 그 이유는 구독자의 유무와 상관없이도 데이터는 흐름처럼 계속 어디론가 전달되는 상태이고 관찰자는 관찰을 시작 할때의 데이터를 캐치할 수도 있다. 물론, 관찰자가 있어야 데이터 흐름이 시작될 수도 있다.
위 코드에 대해 설명하면, 데이터는 just()
함수의 매개변수들이 순차적으로 발행된다. Hello와 Rxjava 문자열이 해당된다. 관찰자는 subscribe()
함수로 설정된다. 현재 println이라는 출력기능을 담당하는 관찰자가 스트림을 관찰하고 있고 Data가 발견되면 그에 맞은 처리를 하게 된다.
RxJava를 왜 사용할까?
여러개의 스트림을 병합
public static void combine() {
String[] data1 = new String[]{"1", "2", "3"};
String[] data2 = new String[]{"A", "B", "C"};
Flowable.combineLatest(
Flowable.fromArray(data1), Flowable.fromArray(data2),
(d1, d2) -> d1 + "-" + d2).subscribe(System.out::println);
}
//출력
3-A
3-B
3-C
콜백 지옥이라는 말을 아는가? 하나의 기능을 구현하기 위해 여러 비동기 로직이 작동되어야 하고 반환된 결과 값이 연속적으로 콜백을 호출할때 발생하는 상황을 말한다.
필자도 생각해보면 카카오톡 로그인을 구현하기 위해 (카카오 API)의 값을 가져와 (자체 서버 로그인 API)를 호출하는 상황이 있었다. Callback으로 구현하면 코드가 복잡해지고 길어지기 때문에 위와 같은 두 개의 스트림 Data를 합쳐주는 combineLasest() 사용하여 간단하게 결과 값을 조합할 수 있다.
스트림 Data Filter
public static void filter() {
Integer[] data = new Integer[] {1, 2, 3, 4, 5, 6};
Flowable.fromArray(data)
.filter(d -> d % 2 == 0)
.subscribe(System.out::println);
}
//출력
2
4
6
filter
는 스트림에 발행되는 데이터를 조건문에 의하여 처리하는 함수이다. 코드 상에서는 2로 나누었을 때 0이 나오는 즉 짝수인 값만 스트림에 재전송한다. 쇼핑몰에서 바지, 후드티 등 스타일에 따른 옷 분류 같은 예시에서 RxJava를 사용하면 보다 적은 코드와 깔끔한 코드로 사용자에게 필요한 Data만 보여주는 코드를 구현할 수 있다.
정리하며
RxJava는 현재 3.0 배포가 된 상태이고, 2.x 버전에 비교해서 달라진 점은 비교 문서에서 볼 수 있다. 정리하려고 했지만 너무 많은 정보가 있어 무리라고 판단된다.
그래도 나름 정리하자면 3.0 이전 버전으로 RxJava를 구현하기 위해 작성했던 코드들은 Java 6 기반으로 되어있었고, 이번 3.0부터 Java8을 도입했다고 한다. Optinal
과 lamda
등 유용하게 베이스 코드들을 변경한 것 같다. 그리고 RxJava 2.x 버전은 유지모드로 변경 즉 새로운 operator와 기능이 추가되지 않으며 오직 버그만 해결하고 이러한 움직임도 2021년 2월 28일까지이다. 그 이후로는 3.0 버전만 집중할 듯 하다.
RxJava는 프로젝트에 꼭 필요한 라이브러리는 아니지만 복잡해지는 프로젝트에서 다수 비동기 호출이 이루어질때 사용하면 좋은 라이브러리이다. 필자는 공부하면서 가장 놀랐던 사실을 넷플릭스가 만든 라이브러리 라는 것...
다음 포스팅에서는 RxJava에서 사용되는 Basic Class를 알아보도록 하겠다.
참고
'Language > RxJava' 카테고리의 다른 글
[RxJava] 여러개 Completable 결합 - andThen (0) | 2021.05.06 |
---|---|
[RxJava] Operators - 변환 (0) | 2021.01.24 |
[RxJava] Operators - 생성 (0) | 2021.01.24 |
[RxJava] Hot Observable (0) | 2020.11.05 |
[RxJava] BaseClasses (0) | 2020.10.26 |