회사에서 코드 수정을 위해서 처음 프로젝트를 열었던 날, 기상천외한 리액터킷이라는 안드로이드 라이브러리를 발견할 수 있었습니다. 이 친구는 IOS의 부산물로 IOS 개발자가 AOS를 개발하면서 자신이 가지고 있던 개념을 쉽게 AOS에 적용시켜 코드를 작성하려는 의도가 담긴 코드였습니다. 딱히 잘못되었다거나 나쁜 것은 아니지만, 문제는 이 라이브러리가 지원 중단이 된 지 꽤 오래된 코드라는 점입니다. 결국 입사하자마자 라이브러리를 분리하는 작업을 거쳐야 했고, 자연스럽게 ReactorKit + RxJava로 구성되어 있던 코드들을 DataBinding + MVVM으로 전환하는 작업을 했었습니다.
이 작업을 진행하는 중에 RxJava 코드를 완전히 분리하고 제거하는 과정을 거쳤는데, 생각해보니 LiveData가 더 늦게 나와서 RxJava를 보완하는 코드라면 RxJava는 점점 도태되어야 할 텐데 아직까지도 RxJava는 계속해서 업데이트되며 사용하는 사람들도 많이 존재하는 것을 확인할 수 있었습니다. 그렇다면, 비슷한 종류의 두 라이브러리가 공존하는 이유(심지어 LiveData는 구글에서 jetpack 이라는 이름 하에 직접 제공함에도)가 무엇인지 알아야할 필요가 생겨서 학습하고자 합니다.
이 글에 들어가기 앞서 일단 두 라이브러리 모두 기본적인 사항들은 알고 있다고 가정하고 들어가겠습니다.
LiveData와 RxJava의 공통점
구글에서 제작하고 jetpack이라는 이름으로 제공하는 LiveData와 넷플릭스에서 기존에 존재하던 ReactiveX를 자바로 이식한 RxJava라는 두 라이브러리의 가장 큰 공통점은 옵저버 패턴을 사용해 반응형 프로그래밍을 할 수 있도록 도와준다는 점 입니다. 옵저버 패턴이란, 어떤 이벤트가 발생하는 것을 감지하고 그에 상응하는 대응을 하는 형태로 작성된 패턴을 말합니다. LiveData와 RxJava는 모두 기본적으로 데이터의 변화를 감지하고 그를 통해 미리 작성해 넘겨둔 코드를 통해 UI의 변동 및 비즈니스 로직의 실행을 도와주는 형태입니다.
LiveData와 RxJava의 차이점
일단 LiveData와 RxJava은 여러가지 차이점이 있는데 가장 중요한 차이점은 LiveData의 경우에는 fragment(or activity)의 라이프사이클을 인식하고 그에 맞춰 구독을 하거나 해지한다는 점입니다.
The observer will only receive events if the owner is in Lifecycle.State.STARTED or Lifecycle.State.RESUMED state (active).
If the owner moves to the Lifecycle.State.DESTROYED state, the observer will automatically be removed.
LiveData의 observe 메소드에 대한 설명중 일부인데, 이 메소드는 파라미터로 받는 lifeCyclerOwner의 생명주기를 인식해 started나 resumed 상태가 되어야만 observable한 상태로 변환되어 데이터 변화를 감지하고, destroyed 이후부터는 참조 상태를 자동으로 해지한다는 것을 알 수 있습니다. 그러나 RxJava는 개발자가 직접 등록하고 해제하는 작업을 거쳐야 하기 때문에 번거로운 점이 있습니다.
또한 2번째 차이점은 LiveData는 android databinding을 통해 간단한 코드의 경우 xml에 직접 등록해 사용할 수 있지만, RxJava는 거기까지 지원하지는 않는다는 것입니다. 그래서 RxJava의 경우에는 UI 변경 작업도 각 view(fragment or activity) 코드에서 이루어집니다.
RxJava의 경우 러닝커브가 매우 큰 편이지만, 큰 러닝커브만큼 지원해주는 기능들이 많습니다. 반대로 LiveData는 그 사용법이 간단한 만큼, 기본적으로 제공해주는 기능에 한계가 존재합니다. 특히 RxJava는 실행 과정에서 subscribeOn이나 observeOn를 통해 어떤 쓰레드에서 실행될 지 결정할 수 있습니다. 하지만 LiveData는 observe 코드 내부에서 직접 코루틴이나 쓰레드를 변경해서 작성해주어야 합니다. 이는 기존의 코드를 이용해 작성하느냐(LiveData), 아니면 좀 더 편리하고 직관적인 새로운 코드를 줘서 새로운 방식으로 작성이 가능하도록 하느냐(RxJava)의 차이인데, 둘 다 동일한 수준으로 사용이 가능하다고 하면 각 라이브러리를 더 효율적인 곳에 배치하여 사용할 수 있습니다.
또한, RxJava의 경우 combineLatest와 같은 메소드를 이용해 여러 데이터를 묶어서 처리할 수 있도록 하는 메소드가 지원되는데 반해 LiveData는 다른 LiveData나 변경 이전 데이터를 참조하는 기능이 따로 존재하지 않아 google sample code에 존재하는 SingleLiveEvent와 같은 코드를 작성해서 사용해야 하는 불편함이 존재합니다.
그래서 둘 중 무엇을 사용하라고?
LiveData는 UI와의 연결성과 낮은 러닝커브에 초점을 둔 라이브러리입니다. 사용하기 쉬우면서도 xml 내부에 직접적으로 binding이 가능하다는 장점을 통해 빠른 UI의 변경을 보장할 수 있고 lifeCycle을 인식함으로서 자동으로 등록 및 해제가 이루어지며 여러개의 observer를 달 수 있어 동시에 다른 여러가지 UI를 처리할 수 있게 도와줍니다.
RxJava의 경우에는 여러가지 로직 처리를 간편하고 읽기 쉽게 작성할 수 있도록 도와주는 라이브러리입니다. 또한, 코드 작동을 고려할 스케쥴러를 지정할 수 있고(IO or Main), map이나 filter와 같이 자바 스트림에서 사용하는 기본적인 작업들이 제공되기 때문에 비즈니스 로직을 더 간단하고 보기 쉽게 처리할 수 있도록 도와줍니다.
두 라이브러리를 비슷하면서도 많이 다른 스탠스를 취하고 있기 때문에 어느 하나의 라이브러리를 선택한다고 해서 다른 라이브러리를 배척하거나 하는 것 보다는, 간단한 로직과 UI 작업은 LiveData를 이용하고 복잡한 비즈니스 로직은 RxJava를 이용하는 것처럼, 두 개의 라이브러리를 적절히 혼용하여 사용하면 더 빠르고 읽기 쉬우며 간단하게 코드를 작성할 수 있을 것 같습니다. 물론 두 개의 라이브러리를 자유자재로 사용하기 위한 러닝커브는 하나를 사용하는 것 보다 훨씬 크겠지만, 더 효율적인 코드는 항상 더 많은 공부를 요구하니 당연한 말일 수도 있겠네요.
이 글을 정리하면서 잡지식을 얻었는데 LiveData는 구글에서 제작한 것은 알았지만, RxJava가 넷플릭스에서 자바로 이식했다는 사실은 조금 놀라운 일이었습니다. 요즈음 넷플릭스라는 이름을 공부하는 과정에서 자주 듣고 있는 것 같습니다.
'안드로이드 > 기타' 카테고리의 다른 글
안드로이드 Application Class (2) | 2022.09.11 |
---|---|
ANR(Application Not Responding)이란? (0) | 2022.08.06 |
AAC 데이터 바인딩이란? (0) | 2022.05.25 |
안드로이드 앱 실행 시간(cold, hot, warm start) (1) | 2021.10.20 |
안드로이드 관련 유용한 오픈소스 및 라이브러리 링크 (0) | 2021.04.23 |
댓글