본문 바로가기
안드로이드 스터디

[Android] 대체 사람들이 RxJava 거리는 게 뭐야?

by HAERO_KR 2020. 11. 23.

안드로이드 앱 개발자 채용 공고를 보면, 어떤 회사이든 자격 요건에 항상 이 말이 적혀 있다.

 

'RxJava 사용이 가능하신 분

'Reactive X 에 익숙하신 분'

'RxJava3 등 Reactive Programming 경험이 있으신 분'

 

뭐가 뭔지 모르겠지만 아무튼 중요하니까 우대 사항, 자격 요건에 Rx 사용 경험을 요구하는 것 같다.

그런데 실제로 Reactive Programming 을 한 번 경험하게 되면 기법 자체가 환상적이며

다시 명령형 프로그래밍 기법으로 돌아갈 수 없다는 말들을 하곤 한다. 그만큼 강력하단 뜻이다.

 

아무튼 Reactive Programming 을 쉽게 구현할 수 있도록 도와주는 라이브러리가 Reactive X 이니까,

Reactive Programming 이 무엇인지, Reactive X 를 사용하면 왜 좋은지 알아보도록 하자.

 

Reactive Programming

직역하면 반응형 프로그래밍? 정도가 된다. 벌써부터 무슨 소리를 하는지 당최 알 수가 없다.

이해하기 전에, 우선 아래와 같은 예시 앱 동작을 살펴보자.

 

고양이는 사랑입니다

 

  1. 사용자가 '고양이' 사진을 검색함
  2. 서버 (백 엔드) API 로 '고양이' 사진 목록을 요청함
  3. 서버 (백 엔드) API 로부터 '고양이' 사진 목록을 받음
  4. 받은 '고양이' 사진 목록을 사용자에게 보여줌

순서 그대로 코딩을 하게 되면 당연히 문제 없이 귀여운 고양이 사진이 사용자에게 보여질 것이다.

이 Flow 는 명령형 프로그래밍 패러다임의 동작이다. 즉 코드 순서대로 동작이 이루어지게 된다.

그런데 명령형 프로그래밍으로 진행할 때, 위 예시 동작은 문제가 발생한다.

기본적인 개념으로 안드로이드 앱 동작에서는 UI Thread 가 곧 Main Thread 이다.

 

때문에 만약 위 예시 동작 이외의 다양한 부가 동작이 있다면, 정상 동작하지 않을 것이다.

무슨 말인지 잘 모르겠다면 아래 그림을 보자.

그림에 따르면 고양이 사진 목록이 UI 상으로 업데이트 (RecyclerView, ListView 바인딩 등) 되기 전까지는

이 외의 모든 동작이 이루어지지 않는다. 갑자기 다른 메뉴로 이동하고 싶다고 해도 이동할 수 없게 된다.

말 그대로, Networking 동작이 끝날 때 까지 (고양이 사진 목록 수신 완료 시) 어플이 멈춘다는 뜻이다.

만약 느려터진 서버의 API 를 활용하거나 서버가 평소보다 느려진 경우 최악의 사용자 경험을 선사할 것이다.

그렇다면 이런 동작이 이상적이지 않을까 하는 생각이 든다.

 

 

그러니까, Networking 동작을 별도의 Thread 에서 진행을 하고 Main Thread 는 제 할일을 하고 있는 것이다.

따라서 Networking 이 진행되고 있음과 동시에 다른 어플 동작들도 문제 없이 진행할 수 있다는 뜻이다.

만약 Networking 동작이 끝나게 되면 완료 신호를 발행하게 되고, 이를 관찰하고 있던 요소가

이 신호를 받아보게 되어 그 때 UI 업데이트를 (RecyclerView, ListView 바인딩 등) 할 수 있는 것이다.

 

말 그대로, Networking 같은 비동기적 처리가 필요한 동작도 진행하되

Main Thread 를 Blocking 하지 않기 때문에 이 외의 모든 동작들도 병행할 수 있다.

그리고 Networking 이 끝나면 (데이터가 준비되면) 그 때 반응하여 Task 를 이어가기 때문에

반응형 프로그래밍 (Reactive Programming) 이라는 명칭이 붙은 것 같다.

 

Observable - Observer 의 상관 관계

 

Reactive Programming 에서 **'고양이 사진 목록'**은 Observable 이라고 부르고

목록을 바인딩 하여 UI 로 뿌리는 RecyclerView Adapter 등을 Observer (Subscriber) 라고 부르게 된다.

Observer 는 Observable 을 구독하여 발행되는 신호를 받을 때 (onNext() 호출 시) 특정 동작을 한다.

 

예시에선 Networking 이 완료되어 Observable 의 데이터가 변경되면 (고양이 목록이 완성되면)

Observer 가 이를 감지하고 사용자 화면에 고양이 목록을 리스트 형태로 보여주는 동작을 하게 된다.

 

그런데 Observable 이 데이터를 발행할 때, Observer 입장에선 정제된 데이터를 받고 싶을 경우도 있다.

예를들어, 고양이 목록 중 생후 10개월이 안된 아기 고양이 사진만 받아보고 싶을 때와 같은 상황이다.

이럴 때 사용하는 것이 Operator (Filter) 이다. 

 

Operator 는 Observable 가 뱉어내는 데이터에 사전에 정의한 필터 및 연산을 적용하여 발행하는 역할을 한다.

 

Observer 는  Observable 이 발행하는 데이터를 Operator (필터) 에 의해 정제하여 받아볼 수 있음

위 사진을 보면 Observable 이 다양한 데이터들을 뱉어내고 있는데, Operator 는 동그라미만 필터링해서 발행해주는 역할을 한다.

이것이 Operator 의 개념이다. 물론 이러한 필터링 및 연산 뿐만 아니라 아래 그림과 같이 대치 및 변환도 가능하다.

 

동그라미 데이터를 마름모 데이터로 대치하는 Operator 를 거치는 모습

 

지금까지 Reactive Programming 이 무엇이고 어떠한 컴포넌트들이 있는지 알아보았다.

Reactive X 는 이러한 동작을 쉽고 간편하게 구현할 수 있도록 도와준다.

언어 별로, 프레임워크 별로 다양한 라이브러리가 나오고 있다.

 

필자는 안드로이드 개발자이기 때문에, 안드로이드에서 Rx 를 어떻게 활용하는지에 대해 관심도가 클 수 밖에 없다.

다음 포스팅은 안드로이드 개발에 적용되는 RxJava 그리고 RxKotlin 과 RxAndroid 에 대하여 알아보도록 하자.