RX

똘이주인·2021년 8월 9일
0

RX란?

RxKotlin, RxAndroid을 알아보기전에 먼저 알아볼것이 있다.

바로 Reactive Programing 이다.

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

  • 주어진 입력 값을 바탕으로 결과를 계산하는 변환 프로그램이며 일반적으로 컴파일러와 수치 계산 을 하는 프로그램이다.
  • 상호작용 프로그램으로 프로그램이 작업을 주도하며 사용자 혹은 다른 프로그램과 상호작용을 합니다. 사용자의 관점에서 볼때는 흔히 말하는 시분할 시스템은 상호작용 프로그램이다.
  • 리액티브 프로그램은 프로그램 자신의 주변 환경과 끊임없이 상호작용을 하는데 프로그램이 주도하는 것이 아니라 환경이 변하면 이벤트를 받아 동작한다.

즉, 근래에 떠오르고 있는 Reactive Programing는 데이터의 흐름과 전달에 관한 프로그래밍 패러다임이라고 볼 수 있다.

왜 사용할까?

개발자들은 사용자 경험(UX)을 향상시키고 싶어한다. 사용자 경험(UX)이 좋은 앱을 만든다는것은 반응형 앱을 개발하고 싶은 것 이다.

그래서 앱에서 메인스레드가 멈추거나 느려지지 않도록 해야하며 사용자들에게 부드러운 사용자 경험(UX)과 좋은 앱 성능을 제공하고 싶어 한다.

하지만 메인 스레드를 자유롭게 핸들링 하면서 유지하려면 무겁고 시간이 오래 걸리는 작업은 백그라운드에서 해야 한다. 그리고 백그라운드에서 조차 무겁고 복잡한 계산 작업이라면 서버에서 수행 하는 것이 Best 이다. 그렇기 때문에 네트워크 운영을 위한 비동기 작업이 필요하다.

비동기 작업은 AsyncTask로도 되지 않나?

맞다.

하지만 2019년 11월 8일 개발자 Charles Munger에 의해 공식적으로 AsyncTask Deprecated되었습니다. 즉, 다른 비동기 처리 라이브러리를 써야한다는 것이죠.그렇다면 왜 이런 상황이 되었나 하고 AsyncTask를 자세히 살펴볼 필요가 있다.

AsyncTask는 전체적인 프로세스를 단순화 하지만 안드로이드의 생명주기를 신경쓰지 않다. 그렇기 때문에 액티비티나 프레그먼트가 안드로이드 생명주기에 의해 재생성되거나 파괴되었을 때 마무리 작업에 대한 내용이 보호되지 않는 불편한 점이 있다.

명령형 프로그래밍과 다르다

  • 명령형 프로그래밍(Imperative programming) – 작성된 코드가 정해진 순서대로 실행됨.
  • 리액티브 프로그래밍(Reactive Programing) – 데이터 흐름을 먼저 정의하고 데이터가 변경되었을 때 연관되는 함수나 메서드가 업데이트 되는 방식.

그래서 ReactiveX가 나왔다

ReactiveX는 비동기 프로그래밍과 Observable 시퀀스를 이용해 이벤트를 처리하기위한 라이브러리

RxKotlin, RxAndroid도 같다?

현재 많은 리액티브 관련 라이브러리가 나와 있는데 대부분 ReactiveX를 사용하기 때문에 RxKotlin, RxJava, RxAndroid, RxSwift 등들은 서로 다른 것이 아니라 하나의 ReactiveX Extensions이라고 보면 된다.

간단히 정리하면 아래와 같다.

  • RxJava: Java(JVM)를 위한 ReactiveX ExtensionsReactive programming(리액티브 프로그래밍) 패러다임을 자바에서 구현한 프로그래밍 라이브러리
  • RxKotlin: Kotlin을 위한 ReactiveX ExtensionsRxJava 라이브러리를 기반으로 포팅하여 코틀린을 위한 리액티브 프로그래밍의 특정 부분을 함수형 프로그래밍으로써 구현한 라이브러리
  • RxAndroid: Android를 위한 ReactiveX Extensions RxJava에 최소한의 클래스를 추가하여 안드로이드 앱에서 리액티브 구성요소를 쉽고 간편하게 사용하게 만드는 라이브러리
  • RxSwift: Swift를 위한 ReactiveX Extensions

위의 ReactiveX Extensions에는 공통점이 있다.

  • 효율적으로 신속하게 비동기 처리를 도와줌
  • 함수형 프로그래밍을 일부 지원함
  • 옵저버패턴(Observer pattern)을 사용함
  • 콜백(Callback)에서 또 콜백을 하는 콜백 지옥에서 벗어날 수 있다.

RxJava 리엑티브 자바란?

  • RxJava 는 자바와 안드로이드를 위한 리엑티브 프로그래밍 구현체
  • 함수형 프로그래밍의 영향을 받았기 때문에 함수 구성을 선호함 ( Ramda 형식 )
  • 전역상태나 부수효과를 피하고 비동기나 이벤트 기반 프로그램을 작성할 때 Stream 방식 ( Ramda Stream ) 으로 생각한다.
  • RxJava 는 생산자/소비자 콜백을 사용한 옵저버 패턴을 시작으로 구성과 변환, 스케줄링, 스로틀링, 오류 처리, 생명주기 관리를 할 수 있는 수많은 연산자를 제공함

RxJava 자바와 안드로이드 뿐만 아니라 서버까지 다루는 오픈소스 라이브러리이다.

리액티브 프로그래밍이란, 데이터나 이벤트 변화와 반응에 초점을 맞춘 프로그래밍을 뜻하는 일반적인 용어

엄밀히 말하면 FRP( fucntional reative programming ) 은 RxJava와 다르다. FRP는 연속적인 시간의 흐름을 포함하고 RxJava는 시간에 대해 불연속적인 이벤트만 다룬다.

리엑티브 함수형 프로그래밍이란

동시성과 병렬성을 해결하는 프로그래밍으로 리액티브나 비동기 요구사항을 명령형 방식으로 만들었을 때 나타나는 콜백 지옥 문제를 해결하는 것이다.

즉 RxJava 를 이용한 리액티브 프로그래밍은 명령형 방식을 이용하지 않고 선언적 접근을 사용한다.

리액티브 프로그래밍이 필요한 순간

  • 마우스 움직임이나 클릭, 키보드 타이핑, GPS 신호, 자이로스코프 신호, 터치 이벤트 처리
  • 비동기성을 띠는 네트워크 등 지연 I/O 이벤트 응답
  • 이벤트나 앞서 나온 사용자 이벤트, 애플리케이션에서 발생하는 이벤트나 데이터를 다룰때

RxJava 동작방법

데이터나 이벤트 스트림을 나타내는 Observable 타입으로 push / reactive 방식을 선호

즉시동작이 아닌 지연실행 가능하고 비동기와 동기 방식 모두 사용가능하고 시간에 따라 많은 이벤트를 다룰 수 있다.

RxJava 가 리액티브이기 위한 핵심은 밀어내기 인데 Observable과 Observer 타입 시그니처가 이를 지원한다.

밀어내기를 지원하기 위해서는 Observable / Observer 쌍을 subscribe로 연결

Observer는 구독을 통해 3가지 유형의 이벤트를 받는다.

interface Observer<T>{
		void onNext( T t )
		void onError( Throwalbe t )
		void onComplete()
}

0개의 댓글