본문 바로가기

프로그래밍/RxJava

[RxJava] 리액티브 프로그래밍 소개

회사에서 진행하는 프로젝트를 계기로, RxJava를 공부하려고 RxJava 프로그래밍 - 한빛 미디어 책을 구입했다. 입문자용이라고 알지만, 그래도 내용이 어려운것 같다. 차근차근 공부하면서 포스팅하겠다.

 

 

한빛미디어-RxJava프로그래밍

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

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

기존의 명령형(imprerative)프로그래밍은 주로 컴퓨터 하드웨어를 대상으로 프로그래머가 작성한 코드가 정해진 절차에 따라 순서대로 실행된다.

그러나, 리액티브 프로그래밍은 데이터 흐름을 먼저 정의하고 데이터가 변경되었을 때 연관되는 함수나 수식이 업데이트되는 방식이다.

 

예를들어 스프레드시트를 말할 수 있다. 각셀에 값을 넣어서 원하는 값을 계산한다. 1월부터 12월까지의 매출의 합을 구하려고 한다. 이때 2월 매출액이 변경되었다고 하면, 지정해둔 수식을 통해서 계산되어 연말 매출액을 갱신하게 될것이다.

 

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

 

리액티브 프로그래밍은 데이터 소스가 변경된 데이터를 밀어주는(push)이다. 일종의 옵저버 패턴이라고 생각하면된다.

 

즉, 다시 말해 어떤 기능을 직접 실행하는 것이 아닌, 시스템에 어떤 이벤트가 발생했을 때 처리하게 되는 것이다.

 

우리가 아는 콜백이나, 옵저버 패턴을 넘어서 RxJava기반의 리액티브 프로그래밍이 되려면 함수형 프로그래밍이 필요하다. 콜백이나 옵저버 패턴은 옵저버가 1개이거나 단일 스레드 환경에서는 문제가 없지만, 멀티 스레드 환경에서는 데드락과 동기화문제가 발생한다.

 

함수형 프로그래밍은 부수 효과(side effect)가 없다. 콜백이나, 옵저버 패턴이 스레드에 안전하지 않는 이유는 경쟁 조건(race condition)에 빠지게 되었을 때 에측할 수 없는 잘못된 결과 값이 나오기 때문이다. 이를 부수효과(side effect)라고 한다. 한 두 개의 스레드가 있을때는 정상 동작하다가 수십 수백 개의 스레드가 동시에 단일 자원에 접근하게 되면 계산 결과가 꼬이고 디버깅하기가 매우 어렵다.

 

함수형 프로그래밍은 부수 효과 없는 순수 함수(pure function)을 지향한다. 그렇기에 멀티 스레드 환경에서도 안전하다. 자바 언어로 리액티브 프로그래밍을 하기 위해서는 함수형 프로그래밍 지원이 필요하다.

 

다시 말하지만, 리액티브 프로그래밍은 데이터 흐름과 변화의 전달에 관한 프로그래밍 패러다임이다.

컴퓨터 프로그램의 세 가지 분류 중 한 가지로 소개가 되기도 한다.

아래의 내용이 개념을 이해하는데 도움이 되는 부분이므로, 반복해서 숙지하도록 하자.

 

[반복해서 읽자]

컴퓨터 프로그램에는 크게 세 가지 종류가 있다.

 

첫 번째는 프로그램으로 주어진 입력값을 바탕으로 결과를 계산하는 프로그램이다. ex) 컴파일러와 수치 계산 프로그램이다.

 

두 번째상호작용 프로그램으로 프로그램이 주도하는 속도로 사용자 혹은 다른 프로그램과 상호작용을 한다. 사용자의 관점으로 볼 때 시분할(time-sharing) 시스템은 상호작용하는 프로그램이다. 

 

세 번째리액티브 프로그램으로, 주변의 환경과 끊임없는 상호작용을 하는데 프로그램이 주도하는 것이 아니라 환경이 변하면 이벤트를 받아서 동작하게 된다.

 

상호작용프로그램은 자신의 속도에 맞춰 일하고 대부분 통신을 담당한다 반면 리액티브 프로그램은 외부 요구에 반응에 맞춰 일하고 대부분 정확한 인터럽트 처리를 담당한다. 

 

애플리케이션에서 RxJava와 같은 리액티브 프로그래밍을 하려면 누군가 리액티브 프로그래밍을 할 수 있는 기반 시설을 제공해주어야 한다. 즉, 데이터 소스를 정의할 수 있고, 그것의 변경 사항을 받아서 내 프로그램에 알려줄(push)존재가 필요하다. 그것을 .NET 환경에서는 리액티브 확장(Reacitive Extentions)이라고 하고, JVM 위의 자바 언어로 구현해 놓은라이브러리가 RxJava이다.

 

RxJava를 만든 이유

1. 자바가 동시성 처리를 하는데 번거로움이 있기 때문이다. 클라이언트의 요청을 처리할 때 다수의 비동기 실행 흐름(스레드 등)을 생성하고 그것의 결과를 취합하여 최종 리턴하는 방식으로 내부 로직을 변경했다.

2. 비동기흐름을 조합할 수 있는 방법이 없었다.

3. 콜백이 콜백을 부르는 콜백 지옥 (callback hell)상황이 코드의 가독성을 떨어뜨린다. 그래서 디버깅을 어렵게 만든다. 다양한 리액티브 연산자를 통해 콜백을 사용하지 않는 방향으로 설계할 수 있도록 했다.

 

'프로그래밍 > RxJava' 카테고리의 다른 글

[RxJava]Observable - just()함수  (0) 2020.02.11
[RxJava] Observable 클래스  (0) 2020.02.11
[RxJava] 마블 다이어그램 보는 방법  (0) 2020.02.11
[RxJava] RxJava 학습 순서  (0) 2020.02.11
[RxJava] Hello RxJava2!  (0) 2020.02.07