Groo

RXJava 소개 본문

프로그래밍 언어/Java

RXJava 소개

김주엽 2020. 8. 25. 22:30

안녕하세요, 오늘은 어려울 수도 있는 주제인 RxJava에 대해서 여러분들께 소개하려고 합니다.
RxJava는 리액티브 프로그래밍에 속하며 지금까지와는 달리 새로운 관점으로 이를 살펴보아야 합니다.

🕵️ 리액티브 프로그래밍이란?

현시대에는 절차 지향적 프로그래밍, 객체지향 프로그래밍, 함수형 프로그래밍 등 다양한 프로그래밍 기법이 존재합니다. 이와 같이 리액티브 프로그래밍 또한 프로그래밍 패러다임이라고 말할 수 있습니다. 다양한 프로그래밍 패러다임들은 각자의 특유한 성질들이 존재합니다. 그중 저희는 오늘 리액티브 프로그래밍 패러다임의 특징과 관련 내용들을 중점으로 살펴보도록 하겠습니다. 

 

기존의 명령형 프로그래밍 (Pull 방식)

컴퓨터 하드웨어를 대상으로 프로그래머가 작성한 코드가 정해진 절차에 따라 순서대로 실행된다.
리액티브 프로그래밍 (Push 방식)

데이터의 흐름을 미리 정의하고 데이터의 값이 변경되었을 때 관련 함수나 수식이 업데이트된다.

예를 들어, 편의점의 연간 매출액을 구하려고 했을 때 특정 월 매출액의 값이 늘거나 줄었을 경우 기존의 명령형 프로그래밍에서는 Pull 방식으로 새롭게 바뀐 데이터와 함께 기존에 변경되지 않은 월 매출액들을 모두 조회하여 처음부터 계산할 것입니다. 그러나 리액티브 프로그래밍에서는 Push 방식으로 새롭게 바뀐 데이터만 기존에 구성한 수식에 전달하여 더욱 효율적으로 계산 가능합니다.

 

즉, 프로그래머가 기존의 명령형 프로그래밍 방식과 같이 어떤 기능을 직접적으로 실행하는 것이 아닌 프로그램 속 시스템에 특정 이벤트가 발생하였을 때 이를 효율적으로 처리하는 것이라고 할 수 있습니다. 일종의 이러한 방식을 옵서버 패턴이라고 부릅니다. 

 

정리하자면 리액티브 프로그래밍은 데이터 흐름과 변화의 전달에 관한 프로그래밍 패러다임입니다. 리액티브 프로그램은 주변의 환경과 끊임없이 상호작용하며 프로그램이 실질적으로 주도하는 것이 아닌 환경이 변화되면 이벤트를 받아 동작하는 과정입니다.

📊 ReactiveX 살펴보자!

위에서 설명했던 리액티브 프로그래밍 패러다임 방식으로 프로그래밍을 할 수 있도록 도와주는 것이 바로 ReactiveX입니다. ReactiveX는 특정 언어가 아닌 라이브러리 및 API와 같이 누구나 손쉽게 사용할 수 있도록 현재 무료로 제공되고 있습니다.

 

ReactiveX의 종류로는 RxJava, RxJs, RxSwift 등 다양한 종류의 언어들을 기반으로 다양한 플랫폼에서 이를 사용할 수 있도록 폭넓은 지원을 해주고 있습니다. 이처럼 ReactiveX에서 제공해주는 각 기술들을 사용하는 목적 중 가장 큰 것은 바로 옵서버블 스트림으로 비동기 프로그래밍을 할 수 있기 때문입니다. (옵서버블이라는 것은 ReactiveX의 대표적인 기술이라는 것만 알아두세요!)

 

위에서 설명한 다양한 종류의 ReactiveX 언어들 중 저희는 RxJava에 대해서 집중적으로 공부해볼 것입니다. ReactiveX의 전체적인 큰 문법 구조는 언어 별로 거의 동일하기 때문에 한 개의 ReactiveX 언어를 배운다면 다른 언어를 배우는 것은 어렵지 않습니다.

🎨 Java 언어에 리액티브 프로그래밍을?

자바는 대표적인 객체 지향 프로그래밍 언어이며 더 나아가 RxJava는 기존 자바에 리액티브 프로그래밍 기반의 요소를 추가한 것입니다. 즉 RxJava를 사용한다면 객체지향 프로그래밍과 리액티브 프로그래밍을 동시에 포함하여 개발할 수 있다는 장점이 있습니다.

 

하지만 저희가 일반적으로 아는 콜백이나 옵서버 패턴을 넘어서 진정한 RxJava 기반의 리액티브 프로그래밍을 수행하려면 함수형 프로그래밍 패러다임을 추가해야 합니다. 그 이유는 콜백이나 옵서버 패턴과 같은 경우 단일 스레드 환경에서 사용 시 문제가 되지 않지만 멀티 스레드 환경에서는 데드락과 동기화 등 문제들이 발생합니다. 그러나 함수형 프로그래밍은 이런 부수효과가 없습니다.

 

함수형 프로그래밍은 위와 같은 부수 효과를 없애기 위해 순수 함수를 지향하고 있습니다. 따라서 단일 스레드 뿐만 아닌 멀티 스레드 환경에서도 안전하기에 자바 언어로 리엑티브 프로그래밍을 하기 위해서는 함수형 프로그래밍의 지원이 빠져서는 절대 안 됩니다.

🙋‍♂️ RxJava를 만들게 된 이유

RxJava는 2013년 2월 넷플릭스에서 처음으로 소개되었습니다. 그 당시 넷플릭스는 REST 기반의 서비스 API 호출 횟수와 서비스의 전반적인 성능을 개선하기 위해 RxJava를 만들었으며 아래와 같은 핵심적인 이유 3가지를 발표하며 RxJava를 출시했습니다.

 

1. 동시성을 적극적으로 끌어안을 필요가 있다. 

2. 자바 Future를 조합하기 어렵다는 점을 해결해야 한다.

3. 콜백 방식의 문제점을 개선해야 한다.

📧 간단한 출력문 구현하기

위에서 설명한 내용들을 바탕으로 RxJava의 가장 기본적인 문법들을 통해 간단한 출력문을 구현해보겠습니다. 먼저 프로젝트 파일 속 build.gradle 파일에 아래의 코드를 추가해주시기 바랍니다. 이는 RxJava를 사용할 수 있도록 설정하는 과정 중 하나입니다.

dependencies {
    implementation 'io.reactivex.rxjava2:rxjava:2.1.3'
}

그 후 프로젝트 파일 속 새로운 클래스 파일인 FirstExample 클래스를 만들고 아래의 코드를 작성해주시기 바랍니다. 그렇다면 최종적으로 프로그램을 실행한다면 콘솔 창 아래에 숫자 1, 2, 3, 4, 5, 6이 순차적으로 출력되는 결과를 바로 볼 수 있을 것입니다.

public class FirstExample {
    private void emit() {
         Observable.just(1, 2, 3, 4, 5, 6)
                 .subscribe(System.out::println);
    }

    public static void main(String[] args) {
        FirstExample demo = new FirstExample();
        demo.emit();
    }
}
Observable 클래스

데이터의 변화가 발생하는 데이터 소스이며 프로그램 속 실질적인 관찰 대상입니다.

just 매소드

Observable 클래스의 just 함수는 가장 단순한 Observable 클래스의 선언 방식입니다. 
subscribe 매소드

Observable 클래스를 구독하며 관찰자 역할을 맡고 있습니다.

위의 코드에서 사용하는 Observer 클래스, just 매소드, subscribe 매소드에 대해서 간략히 알아보았습니다. 일부러 깊숙하게 설명하지 않았습니다. 다음 시간부터 하나씩 자세히 알아볼 것이기 때문입니다. 지금은 이런 것이 있다는 정도로만 기억해주세요!

🚥 마블 다이어그램 활용하기

마블 다이어그램은 리액티브 프로그래밍을 이해할 수 있도록 도와주는 도구입니다. map( ), flatMap( ) 함수 등의 수많은 리액티브 연산자들을 이해하는데 큰 도움을 주기 때문에 공부할 때 마블 다이어그램을 적극적으로 활용한다면 큰 이점이 존재할 것입니다.

 

마블 다이어그램을 활용하는 것은 크게 어렵지 않으며 간단하기 때문에 쉽게 사용할 수 있을 것입니다. 이에 대한 설명은 저와 같은 학교에 다니는 친구 중 ReactiveX에 대해서 잘 알고 있고 설명을 잘해둔 강민석 친구의 마블 다이어그램 글을 참고해주시기 바랍니다.

 

Rx ) 마블 다이어그램?

안녕하세요 Axe입니다! 오늘은 마블 다이어그램에 대해서 알아보겠습니다. 'ReactiveX가 뭔지 압니까?' 글을 읽지 않고 오셨다면, 읽고 오시는 걸 추천해드립니다! :) ReactiveX사이트의 메인화면을 보�

axe-num1.tistory.com

👍 글을 마치며

오늘은 리액티브 프로그래밍 패러다임 관련 내용들을 살펴보았으며 RxJava라는 새로운 기술에 대해서 간단히 알아보았습니다. 리액티브 프로그래밍은 지금까지 저희가 경험해보지 못한 파트이기 때문에 많이 어려울 수 있을 것입니다. 하지만 꾸준히 공부하고 사용해본다면 적응할 수 있을 것이며 리액티브 프로그래밍을 왜 사용해야 하는지 알게 될 것입니다. 저 또한 앞으로도 꾸준히 공부하고 좋은 글 쓸 수 있도록 노력하겠습니다. 아직 리액티브 프로그래밍에 미숙해 위의 글 내용에 오류가 존재한다면 댓글 남겨주세요!

 

참고 : RxJava 프로그래밍

Comments