ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [RxJava2] 리액티브 프로그래밍 및 RxJava란?
    공부 정리/RxJava2 2019. 9. 18. 13:10

    리액티브 프로그래밍은 데이터 흐름과 전달에 관한 프로그래밍 패러다임입니다.​

     

    기존의 명령형(imperative) 프로그래밍은 주로 컴퓨터 하드웨어를 대상으로 프로그래머가 작성한 코드가 정해진 절차에 따라 순서대로 실행됩니다. 그러나 리액티브 프로그래밍은 데이터 흐름을 먼저 정의하고 데이터가 변경되었을 때 연관되는 함수나 수식이 업데이트되는 방식입니다.​

     

    리액티브 프로그래밍을 가장 쉽게 이해할 수 있는 예는 엑셀(스프레드시트)입니다. ​

    각 셀에 값을 넣거나 혹은 다른 셀을 조합해서 내가 원하는 값을 계산합니다.​

    예를 들어 저번 달에 지출의 합을 구한다고 생각해봅시다.​

    하루 지출액은 리액티브 프로그래밍의 데이터 소스에 해당합니다.​

    한 달 지출액은 다음처럼 하루 지출액의 합으로 산출합니다.​

    저번 달 지출액 = 1일 지출액 + 2일 지출액 + 3일 지출액 + …+30일 지출액​

    그런데 최종 지출액을 결산해보니 조금씩 오차를 발견했습니다. 이럴 때 리액티브 프로그래밍은 변경된 지출액을 다시 가져와서 총합을 구하는 방식이 아니라 하루 지출액으로 미리 지정해놓은 데이터 소스에 변경된 값을 전달합니다. 그리고 전달된 각 값이 미리 지정해둔 수식을 통해 계산되어 한 달 지출액을 갱신합니다.​

     

    명령형 프로그래밍 방식은 변경이 발생했다는 통지를 받아서 한달 지출액을 새로 계산하는 당겨오는(pull) 방식이지만, 리액티브 프로그래밍은 데이터 소스가 변경된 데이터를 밀어주는(push) 방식입니다. 일종의 옵서버 패턴이라고 생각하면 됩니다.​

     

    여기까지가 리액티브 프로그래밍에 대한 설명이였습니다. 그렇다면 이제 RxJava는 무엇인지 알아보겠습니다.

     

    RxJava는 2013년 2월 넷플릭스(Netflix)의 기술 블로그에서 처음으로 소개되었습니다. 그 당시 넷플릭스는 REST 기반의 서비스 API 호출 횟수와 서비스의 전반적인 성능을 개선하는 프로젝트를 진행했고, 그 결과 .NET 환경의 리액티브 확장 라이브러리(Rx)를 JVM에 포팅하여 RxJava를 만들었습니다. 넷플릭스에서 RxJava를 만들게 된 핵심적인 이유를 다음과 같이 밝혔습니다.​

    • 동시성을 적극적으로 끌어안을 필요가 있다(Embrace Concurrency).​

    • 자바 Future를 조합하기 어렵다는 점을 해결해야 한다(Java Futures are Expensive to Compose).​

    • 콜백 방식의 문제점을 개선해야 한다(Callback Have Their Own Problems).​

     

    그렇다면 위와같은 문제들은 어떤 식으로 바뀌었을까요.

     

    • 첫 번째 이유의 원인은 자바가 동시성 처리를 하는 데 번거로움이 있기 때문입니다. 이를 해결하려고 넷플릭스는 클라이언트의 요청을 처리하는 서비스 계층에서 동시성을 적극적으로 끌어안았습니다. 클라이언트의 요청을 처리할 때 다수의 비동기 실행 흐름(스레드 등)을 생성하고 그것의 결과를 취합하여 최종 리턴하는 방식으로 내부 로직을 변경했습니다.​

    • 두 번째 이유의 원인은 2013년 당시 자바 8에서 제공하는 CompletableFuture 같은 클래스가 제공되지 않았기 때문입니다. 그래서 비동기 흐름을 조합할 방법이 거의 없었습니다. RxJava에서는 이를 해결하려고 비동기 흐름을 조합(compose)할 수 있는 방법을 제공합니다. RxJava에서 조합하는 실행 단위를 리액티브 연산자(Operators)라고 합니다.​

    • 세 번째 이유의 원인은  콜백이 콜백을 부르는 콜백 지옥(Callback Hell) 상황이 코드의 가독성을 떨어뜨리고 문제 발생 시 디버깅을 어렵게 만들기 때문입니다. 비동기 방식으로 동작하는 가장 대표적인 프로그래밍 패턴은 콜백입니다. 그래서 RxJava는 콜백을 사용하지 않는 방향으로 설계해 이를 해결했습니다.​

     

    리액티브 프로그래밍은 비동기 연산을 필터링, 변환, 조합해 위 세 가지 핵심 이유를 해결할 수 있습니다. 따라서 RxJava는 Observable같은 데이터 소스와 map(), filter(), reduce()와 같은 리액티브 연산자를 제공합니다.​

    참고로 RxJava는 2016년 10월에 완전히 새로 작성한 RxJava 2.0을 발표했습니다. RxJava 2.0은 RxJava 1.x를 Reactive-Streams 스펙 기반으로 새롭게 개선한 것이므로 공통점도 많고 차이점도 많습니다.​

    Reactive-Streams 스펙은 자바 8에 도입된 Stream API와 Observable 기반의 리액티브 프로그래밍을 포괄하는 표준 스펙으로 자바 9에 도입될 예정입니다.​

     

     

    저도 책을 보며 공부한 내용들을 정리하는 블로그이므로 잘못된 점 혹은 제가 잘못 이해한 점들은 댓글로 남겨주세요.

    참고 : 유동환, 박정준 - RxJava프로그래밍

     

Designed by Tistory.