안드로이드 앱 개발자 채용 공고를 보면, 어떤 회사이든 자격 요건에 항상 이 말이 적혀 있다.
'RxJava 사용이 가능하신 분
'Reactive X 에 익숙하신 분'
'RxJava3 등 Reactive Programming 경험이 있으신 분'
뭐가 뭔지 모르겠지만 아무튼 중요하니까 우대 사항, 자격 요건에 Rx 사용 경험을 요구하는 것 같다.
그런데 실제로 Reactive Programming 을 한 번 경험하게 되면 기법 자체가 환상적이며
다시 명령형 프로그래밍 기법으로 돌아갈 수 없다는 말들을 하곤 한다. 그만큼 강력하단 뜻이다.
아무튼 Reactive Programming 을 쉽게 구현할 수 있도록 도와주는 라이브러리가 Reactive X 이니까,
Reactive Programming 이 무엇인지, Reactive X 를 사용하면 왜 좋은지 알아보도록 하자.
Reactive Programming
직역하면 반응형 프로그래밍? 정도가 된다. 벌써부터 무슨 소리를 하는지 당최 알 수가 없다.
이해하기 전에, 우선 아래와 같은 예시 앱 동작을 살펴보자.
- 사용자가 '고양이' 사진을 검색함
- 서버 (백 엔드) API 로 '고양이' 사진 목록을 요청함
- 서버 (백 엔드) API 로부터 '고양이' 사진 목록을 받음
- 받은 '고양이' 사진 목록을 사용자에게 보여줌
순서 그대로 코딩을 하게 되면 당연히 문제 없이 귀여운 고양이 사진이 사용자에게 보여질 것이다.
이 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) 이라는 명칭이 붙은 것 같다.
Reactive Programming 에서 **'고양이 사진 목록'**은 Observable 이라고 부르고
목록을 바인딩 하여 UI 로 뿌리는 RecyclerView Adapter 등을 Observer (Subscriber) 라고 부르게 된다.
Observer 는 Observable 을 구독하여 발행되는 신호를 받을 때 (onNext() 호출 시) 특정 동작을 한다.
예시에선 Networking 이 완료되어 Observable 의 데이터가 변경되면 (고양이 목록이 완성되면)
Observer 가 이를 감지하고 사용자 화면에 고양이 목록을 리스트 형태로 보여주는 동작을 하게 된다.
그런데 Observable 이 데이터를 발행할 때, Observer 입장에선 정제된 데이터를 받고 싶을 경우도 있다.
예를들어, 고양이 목록 중 생후 10개월이 안된 아기 고양이 사진만 받아보고 싶을 때와 같은 상황이다.
이럴 때 사용하는 것이 Operator (Filter) 이다.
Operator 는 Observable 가 뱉어내는 데이터에 사전에 정의한 필터 및 연산을 적용하여 발행하는 역할을 한다.
위 사진을 보면 Observable 이 다양한 데이터들을 뱉어내고 있는데, Operator 는 동그라미만 필터링해서 발행해주는 역할을 한다.
이것이 Operator 의 개념이다. 물론 이러한 필터링 및 연산 뿐만 아니라 아래 그림과 같이 대치 및 변환도 가능하다.
지금까지 Reactive Programming 이 무엇이고 어떠한 컴포넌트들이 있는지 알아보았다.
Reactive X 는 이러한 동작을 쉽고 간편하게 구현할 수 있도록 도와준다.
언어 별로, 프레임워크 별로 다양한 라이브러리가 나오고 있다.
필자는 안드로이드 개발자이기 때문에, 안드로이드에서 Rx 를 어떻게 활용하는지에 대해 관심도가 클 수 밖에 없다.
다음 포스팅은 안드로이드 개발에 적용되는 RxJava 그리고 RxKotlin 과 RxAndroid 에 대하여 알아보도록 하자.
'안드로이드 스터디' 카테고리의 다른 글
[Kotlin] 언제 뭘 써야 돼? 헷갈리는 스코프 함수 한 방 정리 (2) | 2021.03.15 |
---|---|
[Android] 깔쌈하게 MVVM 패턴과 AAC 알아보기 (0) | 2020.11.17 |