본문 바로가기
안드로이드/RxJava

[안드로이드/Kotlin] RxJava - RxJava란?

by krapoi 2022. 6. 24.
반응형

안드로이드를 반응형으로 프로그래밍할 때, 코루틴과 RxJava를 사용해서 프로그래밍할 수 있는데 나는 RxJava를 배워 보려 한다.

 

먼저 왜 배워야 하는지 알아보자.

 

RxJava를 배우는 이유

먼저 개발자들은 동시성 문제, 다중 이벤트 처리, 백그라운드 스레드 처리 등을 다루면서 많은 문제점에 직면한다.

이에 RxJava는 범용적이고 확실한 해결책을 제시해 준다.

대부분의 사용자들은 애플리케이션이 사용자의 요청에 즉각 적으로 반응하길 원하며 ( 앱이 빠르길 원하며 ),

반응성이 느린 앱은 ( 속도가 느린 앱은 ) 활성 사용자 지표에 영향을 미칠 수 있다. 

 

RxJava는 어려운 작업을 쉽게 하며, 기존에 작성한 비즈니스 로직에 새로운 프로세스가 추가되어야 한다는 것을 알게 되어도, 큰 리팩터링 없이 몇 초 만에 변경 사항을 구현할 수도 있다. 애플리케이션이 네트워크 연결과 관련된 문제가 발생했을 때 이에 대해 대기 및 재시도 작업 같은 예외 사항 처리를 추가하는 것도 쉽게 구현 가능하다.

즉 프로덕션의 안정성을 유지하면서 애플리케이션을 전략적으로 진화시킬 수 있는 것이다.

 

RxJava란?

RxJava ReactiveX ( Reactive Extensions) 를 자바로 구현한 라이브러리이다.

ReactiveX는 Microsoft사 주도 아래 옵저버 패턴, 이터레이터 패턴, 함수형 프로그래밍의 장점과 개념을 접목한 반응형 프로그래밍 기법을 의미한다. RxJava는 이벤트 처리 및 비동기 처리의 구성에 최적화된 라이브러리이다.

Observable 추상화 및 관련 상위 함수에 중점을 둔 단일 JAR로 가벼운 라이브러리이다.

 

 

그렇다면 이 RxJava에서 말하는 반응형 프로그래밍이 도대체 뭘까?

 

반응형 프로그래밍이란?

이 반응형 프로그래밍은 주변 환경과 끊임없이 상호작용을 하는 프로그래밍을 의미하며, 프로그램이 주도하는 것이 아닌 환경이 변하면 이벤트를 받아 동작하도록 만드는 프로그래밍 기법을 말한다.

반응형 프로그램은 외부 요구에 끊임없이 반응하고 처리한다.

 

명령형 프로그래밍과 반응형 프로그래밍의 차이

프로그래밍의 패러다임에는 여러 가지가 있다. 여기서 우리는 이 반응형 프로그래밍의 반대되는 명령형 프로그래밍 과의 차이를 알아보자.

 

명령형 프로그래밍은 작성된 코드가 정해진 순서대로 실행되는 방식의 프로그래밍을 의미한다.

코드가 순서대로 실행되므로 개념적으로 친밀하고, 직접적으로 구체화되기 때문에 이해하기가 쉽다.

 

여기서 코드가 순서대로 실행된다는 의미는 개발자가 작성한 조건문, 반복문 또는 함수 호출 등에 의해 컴파일러가 다른 코드로 이동하는 것을 뜻한다. 디버거가 코드의 명령문을 명확하게 가리킬 수 있고 다음 코드라인이 무엇인지 명확하게 알 수 있다.

 

그러면 이 명령형 프로그래밍의 예를 살펴보자

@Test
fun addition_isCorrect() {
        val items:ArrayList<Int> = ArrayList<Int>()
        items.add(1)
        items.add(2)
        items.add(3)
        items.add(4)

        items.forEach { i -> if (i % 2 == 0) println(i) }

        items.add(5)
        items.add(6)
        items.add(7)
        items.add(8)
}

결과 사진이다

위 코드는 다음과 같이 정리가 가능하다.

 

  1. 리스트를 만든다.
  2. 리스트에 1 ~ 4까지 아이템을 순차적으로 추가한다.
  3. items라는 리스트를 검사하며, 짝수를 출력한다.
  4. 리스트에 5부터 8까지 아이템을 순차적으로 추가한다.

 

출력 명령 이후 리스트에 아이템을 추가해도 콘솔에는 영향을 끼치지 않는다.

 

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

 

이것도 코드를 살펴보자.

    @Test
    fun addition_isCorrect() {
        val items:PublishSubject<Int> = PublishSubject.create()
        items.onNext(1)
        items.onNext(2)
        items.onNext(3)
        items.onNext(4)

        items.filter{i -> i % 2 == 0}
            .subscribe(System.out::println)

        items.onNext(5)
        items.onNext(6)
        items.onNext(7)
        items.onNext(8)
    }

결과 사진이다.

위 코드는 다음과 같이 정리가 가능하다.

 

  1. 데이터 스트림을 만든다. ( PublishSubject )
  2. 데이터 스트림에 1 ~ 4까지를 순차적으로 추가한다.
  3. 데이터 스트림에서 짝수만 출력하는 데이터 스트림으로 변경한 뒤 구독한다.
  4. 데이터 스트림에 5 ~ 8까지를 순차적으로 추가한다.

PublishSubject는 구독 시점 이후의 데이터만 옵저버에 전달한다는 특징이 있어 짝수인 6, 8 만 출력이 된다. 

만약 구독 시점 이전의 데이터도 출력되길 원한다면, ReplaySubject로 대체할 수 있다.

 

 

이렇게 오늘은 RxJava에 대해 알아보았다.

다음에는 마블 다이어 그램과 옵저버 등에 대해 알아보겠다.

 

 

참고자료 : 아키텍처를 알아야 앱 개발이 보인다, 옥수환 저

 

반응형