JEP's Diary

리액티브 프로그래밍 개념 본문

Development/Reactive

리액티브 프로그래밍 개념

지으니88 2018. 7. 24. 17:21

0. 리액티브 프로그래밍 목적 

- 서버 다수와 통신하게 되면 API 호출 각가에 콜백을 추가하게 되고 콜백이 늘어날수록 코드복잡성도 늘어난다. 이를 콜백지옥이라 한다. RxJava는 이러한 콜백지옥을 해결하는 방법이 된다.

- 복잡한 비동기 프로그램을 쉽게 만들 수 있게 도와준다. 이벤트(스크린터치, 마우스클릭, 키입력, 서버의 비동기응답)에 소비자가 비동기로 반응하여 처리한다.

- 또한 비동기에서 처리하기 힘든 에러 처리나 데이터 가공을 쉽게 도와준다. 이벤트를 콜백이 아닌 데이터의 모음으로 모델링하기 때문이다.


1.리액티브 프로그래밍

: 데이터 흐름과 전달에 관한 프로그래밍 패러다임.

: 데이터 흐름을 먼저 정의하고 데이터가 변경되었을때 연관되는 함수나 수식이 업데이트되는 방식

- 예 ) 엑셀에서의 1~12월의 월매출을 더한 것이 연매출이 된다.

명령형 프로그래밍방식은 8월매출액이 변경이 되었을때, 변경이 발생했다는 통지를 받아서 연말 매출액을 새로 계산하는 당겨오는(Pull)방식.

리액티브 프로그래밍 방식은 8월 매출액이 변경되었을때 변경된 8월매출액의 데이터를 밀어주는 (Push)방식. 일종의 옵저버 패턴.

리액티브 프로그래밍은 변경된 매출액을 다시 가져와서 총합을 구하는 방식이 아니라 매월 매출액으로 지정해놓은 데이터소스에서 변경된 값을 전달하고. 전달된 8월의 개별값이 미리 지정해둔 수식을 통해 계산되어 연말매출액을 갱신한다.

: 기존 자바에서 썼던 Pull방식이이 아닌 Push방식의 프로그래밍 개념이다.

: 함수형 프로그래밍의 지원을 받는다. 함수형 프로그래밍은 부수효과가 없는 순수함수를 지향한다. 따라서 멀티 스레드환경에서도 안전하다.

: 애플리케이션에서 RxJava와 같은 리액티브 프로그래밍을 하려면 누군가 리액티브 프로그래밍을 할 수 있는 기반 시설을 제공해주어야한다.

- 즉, 데이터 소스를 정의할 수 있고 그것의 변경사항을 받아서 내 프로그램에 알려줄(Push) 존재가 필요하다. 그것을 .NET환경에서는 리액티브확장(Rx)이라 하고 JVM위의 자바 언어로 구현해놓은 라이브러리가 RxJava이다.


2.RxJava를 만들게 된 이유

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

  • 동시성을 적극적으로 끌어안을 필요가 있다. 
    • 자바가 동시성 처리를 하는데 번거로움이 있다. 이를 위해 클라이언트의 요청을 처리하는 서비스 계층에서 동시성을 적극적으로 끌어안았는데, 클라이언트의 요청을 처리할때 다수의 비동기 실행흐름(쓰레드 등)을 생성하고 그것의 결과를 취합하여 최종 리턴하는 방식으로 내부 로직을 변경했다.
  • 자바 Future를 조합하기 어렵다는 점을 해결해야 한다.
    • 자바는 자바8에서 제공하는 CompletableFuture같은 클래스가 제공되지않아서 비동기흐름을 조합할 방법이 거이 없었다. 따라서 RxJava에서는 비동기 흐름을 조합할 수 있는 방법을 제공한다. RxJava에서는 조합하는 실행단위를 리액티브연산자라고 한다.
  • 콜백 방식의 문제점을 개선해야 한다.
    • 콜백이 콜백을 부르는 콜백지옥상황이 코드의 가독성을 떨어뜨리고 디버깅이 어렵다. RxJava는 콜백을 사용하지 않는 방향으로 설계해 이를 해결했다.

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


3.주요용어 및 함수정리

: Observable 

데이터의 변화가 발생하는 데이터 소스이다. 

: just()함수

Observable클래스의 just()함수는 가장 단순한 Observable 선언 방식이다. 

: subscribe()함수

 subscribe()함수는 Observable을 구독한다. Observable은 subscribe()함수를 호출해야 비로소 변화한 데이터를 구독자에게 발행한다. (just()함수만 호출하면 데이터를 발행하지 않는다.)

: emit()함수

동사 emit은 '어떤것을 내보내다'라는 뜻인데 RxJava문서에는 Observable이 subscribe()함수를 호출한 구독자에게 데이터를 발행한 것을 표현하는 용어로 사용한다.


참고 : RxJava프로그래밍 (리액티브 프로그래밍 기초부터 RxAndroid까지 한 번에)


'Development > Reactive' 카테고리의 다른 글

스케줄러  (0) 2018.07.28
리액티브 연산자2  (0) 2018.07.28
리액티브 연산자1  (0) 2018.07.28
Observable 알고가기  (0) 2018.07.25