[java] RxJava의 비동기 처리 패턴

RxJava은 자바에서 비동기 처리를 간편하게 할 수 있도록 도와주는 라이브러리입니다. 이를 통해 코드의 가독성과 유연성을 높일 수 있으며, 복잡한 비동기 작업을 신뢰성 있게 처리할 수 있습니다.

Observable과 Subscriber

RxJava의 핵심 개념은 Observable과 Subscriber입니다. Observable은 데이터를 생성하고 Subscriber는 이를 소비합니다. Observable은 데이터를 흘려보내며, Subscriber는 이를 받아 처리합니다. 이를 통해 비동기 작업을 처리할 수 있습니다.

Observable<String> observable = Observable.just("Hello, RxJava!");

Subscriber<String> subscriber = new Subscriber<String>() {
    @Override
    public void onNext(String s) {
        System.out.println(s);
    }

    @Override
    public void onError(Throwable e) {
        e.printStackTrace();
    }

    @Override
    public void onComplete() {
        System.out.println("Completed");
    }
};

observable.subscribe(subscriber);

위 코드에서는 “Hello, RxJava!”라는 데이터를 생성하는 Observable을 생성하고, 이를 구독하는 Subscriber를 정의합니다. Subscriber의 onNext() 메서드는 각 데이터를 처리하고, onComplete() 메서드는 모든 데이터를 성공적으로 처리했음을 알립니다.

스케줄러(Scheduler)

RxJava는 스케줄러를 제공하여 비동기 작업을 언제, 어디서 처리할지를 제어할 수 있습니다. 기본적으로는 현재 스레드에서 동작하지만, 여러 스케줄러를 사용하여 다른 스레드에서 작업을 처리할 수도 있습니다.

Observable.just("Hello, RxJava!")
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new Consumer<String>() {
            @Override
            public void accept(String s) throws Exception {
                textView.setText(s);
            }
        });

위 코드에서는 subscribeOn() 메서드를 이용하여 작업을 백그라운드 스레드에서 처리하고, observeOn() 메서드를 이용하여 결과를 UI 스레드에서 처리하도록 설정합니다. 이렇게 함으로써 네트워크 요청 등의 백그라운드 작업을 수행하고 결과를 메인 스레드에서 UI에 반영할 수 있습니다.

연산자(Operator)

RxJava는 다양한 연산자를 제공하여 데이터를 변환하고 처리하는 과정을 손쉽게 할 수 있습니다. 예를 들어, map() 연산자를 사용하면 데이터를 변환할 수 있으며, filter() 연산자를 사용하면 특정 조건에 맞는 데이터만 걸러낼 수 있습니다.

Observable.just(1, 2, 3, 4, 5)
        .map(new Function<Integer, String>() {
            @Override
            public String apply(Integer integer) throws Exception {
                return "Number: " + integer;
            }
        })
        .filter(new Predicate<String>() {
            @Override
            public boolean test(String s) throws Exception {
                return s.contains("3");
            }
        })
        .subscribe(new Consumer<String>() {
            @Override
            public void accept(String s) throws Exception {
                System.out.println(s);
            }
        });

위 코드에서는 정수형 데이터를 받아 문자열로 변환하고, 그 중 “3”이 포함된 데이터만 출력하는 예제입니다. 이처럼 연산자를 활용하여 데이터를 원하는 형태로 가공할 수 있습니다.

결론

RxJava를 사용하면 비동기 작업을 더 쉽고 간편하게 처리할 수 있습니다. Observable과 Subscriber, 스케줄러, 연산자 등을 활용하여 코드를 유연하고 가독성 있게 작성할 수 있습니다. RxJava는 앱의 성능을 향상시키고 개발자의 생산성을 높일 수 있는 강력한 도구입니다.

참고 문서: RxJava 공식 문서