-
[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에 도입될 예정입니다.
저도 책을 보며 공부한 내용들을 정리하는 블로그이므로 잘못된 점 혹은 제가 잘못 이해한 점들은 댓글로 남겨주세요.
-