Yenarue's Log Generalist Software Engineer :-)

리액티브 프로그래밍, RxJava에 대한 개념과 사상에 대한 이해

|

Rx란?

Rx는 90년대 후반에 생겨난 함수형 리액티브 프로그래밍이라는 개념을 바탕으로 에릭마이어가 개발한 Microsoft .NET의 Reactive Extension이다. 그 이후, 넷플릭스에서 이를 JVM으로 이식하여 RxJava가 탄생하게 되었다. 이식의 타겟을 Java가 아닌 JVM으로 잡음으로서, JVM기반의 모든 언어들 (Scala, Closure, Groovy 등)에서도 Rx를 사용할 수 있는 가능성을 열어두게 되었다.

Rxjava란?

RxJava는 Reactive Extension(이하 Rx)이 Java에 이식된 라이브러리이다.

“비동기/이벤트 기반 프로그램을 작성하기 위한 라이브러리”

  • 함수형 프로그래밍의 영향을 받았다. 따라서 함수형 구성을 선호한다.
  • 데이터플로우 프로그래밍의 영향을 받았다.
  • 전역 상태나 부수적인 효과를 피하고 이벤트 기반이나 비동기성 로직 작성시에는 스트림 방식으로 생각하는 것을 지향한다.
  • 옵저버 패턴, 스케줄링, Throttling, 오류처리, 생명주기 등을 관리하는 연산자를 제공한다.

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

데이터나 이벤트 변화에 반응하는 것에 초점을 맞춘 프로그래밍을 뜻하는 용어이다. 리액티브 프로그래밍이 함수형 프로그래밍과 자주 함께 언급되다보니, 리액티브 프로그래밍과 함수형 프로그래밍을 동일시 하는 사람들이 있다. 하지만 리액티브 프로그래밍과 함수형 프로그래밍은 다른 그룹에 속하는 개념이다. 그렇기 때문에 리액티브 프로그래밍도 명령형 프로그래밍으로 작성 가능하다.

리액티브 프로그래밍을 명령형으로 처리하는 방식 중의 하나가 콜백 처리이다. 리액티브 프로그래밍이 잘 이해되지 않는다면 엑셀 등의 스프레드 시트를 생각해보도록 하자. 스프레드시트에서 특정 셀이 다른 셀들의 데이터에 의존하고 있는 경우, 해당 데이터가 변화하면 자동으로 반응하여 상태가 업데이트된다는 것을 알고있다면 이해가 쉬울 것이다. 그것이 곧 리액티브이기 때문이다 :-)

리액티브 함수형 프로그래밍 (Functional Reactive Programming, FRP) 이란?

고수준 언어가 기계어를 추상화 했듯이 FRP 또한 명령형 프로그래밍을 선언적으로 추상화했다고 생각하면 될 듯 하다. 즉, 사실 결국에는 OS와 하드웨어에 명령을 내리는 명령형으로 귀결된다.
심오. 하지만 이해가 된다. 하드웨어 자체가 그런걸 어떻게 해ㅠㅠ

개인적으로… 선언적이라는 용어가 굉장히 추상적이고 모호한 용어인 것 같다. 좀 더 학습이 필요할 듯 하다. 좀 더 명확해지면 따로 포스팅하도록 하자

그렇다면 RxJava는 FRP 일까?

Rx가 함수형 프로그래밍에 영향을 받은 것은 사실이지만 엄밀히 말하자면 함수형 리액티브 프로그래밍이라고 보기는 어렵다. 연속적인 시간의 흐름을 포함해야 함수형 프로그래밍이라고 볼 수 있는데, RxJava는 사실상 불연속적인 시간의 흐름(이벤트)만을 다루기 때문이다. 즉, RxJava를 잘 표현하는 용어는 리액티브 프로그래밍 뿐이다.

다만, RxJava는 함수형 프로그래밍의 영향을 받았기 때문에 함수형 스타일을 사용한다. #Functional Style #LISP

용어나 개념이 점점 헷갈리게 표현되고 있는 것 같으니…. 일단은 RxJava가 의도적으로 명령형 프로그래밍과는 다른 모델을 채택했고, 그 모델이 함수형 프로그래밍 스타일이라는 점을 기억하도록 하자.

그래서 리액티브 프로그래밍은 어느 상황에 필요한걸까?

  • 이벤트 처리 (마우스 이벤트, 키보드 이벤트, GPS 신호 등…)
  • 비동기성 로직처리 (디스크/네트워크 등… IO 이벤트 응답 등..)
  • S/W, H/W 인터럽트성 이벤트나 데이터 처리 (하드웨어 신호, 아날로그 센서의 이벤트 등…)

특히, 네트워크 호출 및 응답과 같은 복잡한 비동기 처리에서 매우 큰 강점을 보이는데, 이때 조건절이나 에러처리, 리소스 정리 등에 대한 복잡한 로직을 매우 간결하게 처리할 수 있게 된다.

다만, 언제나 함수형 리액티브가 정답인 것은 아니다. 간단하고 독립적인 이벤트 스트림을 처리하는 경우에는 콜백기반 명령형 리액티브도 나쁘지 않은 선택이다. 오히려 추상화단계가 생략되므로 제대로만 작성한다면 더욱 효율적일 수 있다.

Comments