1. RX? 그게 뭐죠? 먹는건가요? - Reactive Programing 🤨

RxKotlin, RxAndroid을 알아보기전에 먼저 알아볼것이 있습니다.
바로 Reactive Programing 입니다.

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

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

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

(1) 그렇다면 왜 사용할까요?
자 한번 개발자적인 측면에서 생각해보면 간단합니다.
우리 개발자들은 사용자 경험(UX)을 향상시키고 싶어합니다. 사용자 경험(UX)이 좋은 앱을 만든다는것은 반응형 앱을 개발하고 싶은 것 입니다.
그래서 앱에서 메인스레드가 멈추거나 느려지지 않도록 해야하며 사용자들에게 부드러운 사용자 경험(UX)과 좋은 앱 성능을 제공하고 싶어 합니다.
하지만 메인 스레드를 자유롭게 핸들링 하면서 유지하려면 무겁고 시간이 오래 걸리는 작업은 백그라운드에서 해야 합니다. 그리고 백그라운드에서 조차 무겁고 복잡한 계산 작업이라면 서버에서 수행 하는 것이 Best 입니다. 그렇기 때문에 네트워크 운영을 위한 비동기 작업이 필요합니다.

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

현재도 그렇고 과거에도 그랬지만 많은 애플리케이션이 대표적으로 가지는 문제는 서버로부터 데이터를 가져오는 길고 긴 백그라운드 작업입니다. 네트워크 작업은 시간이 짧다면 상관이 없지만 오래 걸리는 상황이 잦기 때문에 비동기적으로 서버에 요청하고 데이터를 받아서 UI 업데이트를 하는 것이 중요합니다. 하지만 네트워크 요청이 완료 될 때 UI와 관련 된 부분에 어떠한 문제가 있어 더 이상 존재하지 않거나 에러가 발생하여 충돌 또는 버그가 발생할 수 있는 근본적인 문제가 있습니다. 이건 일반적인 스레드 프로그래밍이 가지고 있는 위험성과 크게 다르지 않습니다.
AsyncTask는 전체적인 프로세스를 단순화 하지만 안드로이드의 생명주기를 신경쓰지 않습니다. 그렇기 때문에 액티비티나 프레그먼트가 안드로이드 생명주기에 의해 재생성되거나 파괴되었을 때 마무리 작업에 대한 내용이 보호되지 않는 불편한 점이 있습니다.
이러한 단점 외에도 기타 단점이 여럿 존재합니다.

(3) 명령형 프로그래밍과 다르다!

  • 명령형 프로그래밍(Imperative programming) – 작성된 코드가 정해진 순서대로 실행됨.
  • 리액티브 프로그래밍(Reactive Programing) – 데이터 흐름을 먼저 정의하고 데이터가 변경되었을 때 연관되는 함수나 메서드가 업데이트 되는 방식. 
    함수형 프로그래밍을 하다보면 비동기 처리가 아쉽기 때문에 리액티브에 절로 눈이가게 됩니다🤤

(4) 그래서 ReactiveX가 나왔다!
ReactiveX는 비동기 프로그래밍과 Observable 시퀀스를 이용해 이벤트를 처리하기위한 라이브러리입니다.

2. 아하! 이제 알겠어요! RxKotlin, RxAndroid도 같은 건가요? 🙋🏻

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

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

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

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

하지만 단점이 제일 크게 다가오는데요... 바로 러닝 커브가 가파르기에 진입장벽이 높습니다...
솔직히 처음 혼자 배우게 되면 뭐가 뭔지 모릅니다...

'Develop > Android' 카테고리의 다른 글

안드로이드(Android) 개발자 로드맵  (0) 2021.11.28
MVVM 패턴  (0) 2021.11.26
MVP 패턴  (0) 2021.11.26
MVC 패턴  (0) 2021.11.14
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기