[java] RxJava의 동시성(concurrency)

RxJava는 반응형 프로그래밍을 위한 자바 라이브러리로, 동시성을 처리하는 기능을 제공합니다. 동시성은 여러 작업을 동시에 실행하고 관리하는 기능을 의미합니다. RxJava는 이런 동시성 작업을 보다 쉽게 관리하고 제어할 수 있도록 도와줍니다.

스케줄러(Scheduler)

RxJava에서 동시성 작업을 관리할 때 사용하는 주요 개념은 스케줄러(Scheduler)입니다. 스케줄러는 작업을 실행하는 실행 컨텍스트를 나타내며, RxJava는 다양한 스케줄러를 제공합니다. 각 스케줄러는 다른 실행 컨텍스트를 가지고 작업을 실행하므로, 우리는 원하는 동시성 모델에 따라 적절한 스케줄러를 선택할 수 있습니다.

주요 스케줄러

예제 코드

Observable.just("Hello")
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(text -> {
        // UI 업데이트 등의 작업을 수행한다.
    }, error -> {
        // 에러 처리를 한다.
    });

위의 예제 코드에서는 “Hello”라는 문자열을 생성한 후, subscribeOn() 메소드로 작업을 Schedulers.io() 스케줄러에서 실행하도록 지정했습니다. 그리고 observeOn() 메소드로 결과를 받는 작업을 AndroidSchedulers.mainThread() 스케줄러에서 실행하도록 지정했습니다. 따라서 결과를 받는 작업은 안드로이드 UI 스레드에서 실행되고, UI 업데이트 등의 작업을 수행할 수 있게 됩니다.

동시성 처리 패턴

RxJava는 동시성 처리를 위해 다양한 패턴을 지원합니다. 몇 가지 주요 패턴을 살펴보겠습니다.

병렬 처리

여러 작업을 동시에 실행하여 병렬로 처리할 때는 flatMap() 연산자를 사용합니다. flatMap()은 각 항목에 대해 비동기 작업을 생성하고 결과를 합치는 역할을 합니다. 이를 통해 여러 작업을 병렬로 실행할 수 있습니다.

스로틀링(Throttling)

일정한 주기로 이벤트를 제한하여 처리할 때는 throttleFirst() 또는 throttleLast() 연산자를 사용합니다. 이 연산자는 일정 주기 동안 가장 처음 또는 마지막 이벤트만 처리하도록 제한합니다. 이를 통해 과도한 이벤트 처리를 방지하고 원하는 동시성 모델을 구현할 수 있습니다.

타임아웃 처리

작업이 일정 시간 내에 완료되지 않을 경우 처리할 때는 timeout() 연산자를 사용합니다. 이 연산자는 일정 시간 동안 결과가 오지 않으면 에러를 발생시킵니다. 이를 통해 작업이 늦어지는 것을 감지하고 적절한 조치를 취할 수 있습니다.

결론

RxJava는 동시성 처리를 위한 강력한 도구입니다. 스케줄러를 사용하여 작업을 다양한 실행 컨텍스트에서 실행하고, 다양한 동시성 패턴을 적용할 수 있습니다. 이를 통해 병렬 처리, 스로틀링, 타임아웃 처리 등 다양한 동시성 요구사항을 쉽게 처리할 수 있습니다.


참고 자료: