본문 바로가기
Development/Android

Android - LifecycleOwner vs ViewLifecycleOwner

by du.it.ddu 2023. 1. 15.
반응형

Android 앱을 개발하면서 가장 기본적이고 중요한 것 중 하나는 앱의 생명주기라고 생각한다.
생명주기, Lifecycle은 Activity, Fragment, Service 와 같은 앱의 구성요소에 따라 다르다.
흐름은 어느정도 비슷하지만, 호출되는 함수가 다른 등의 차이가 있다.

현재 Android앱을 개발하면 Jetpack을 너무나도 당연히 사용하게 되고,
LiveData와 ViewModel 또한 활용하고 있을 것이다.
그러다보면 자연스럽게 LifecycleOnwer, ViewLifecycleOwner에 대해 알게 된다.

그렇다면 이 둘의 차이는 무엇인지 정리해보자.


LifecycleOwner가 뭐야?

먼저, LifecycleOwer에 대해 알아보자.
https://developer.android.com/topic/libraries/architecture/lifecycle?hl=ko#lco

 

수명 주기 인식 구성요소로 수명 주기 처리  |  Android 개발자  |  Android Developers

새 Lifecycle 클래스를 사용하여 활동 및 프래그먼트 수명 주기를 관리합니다.

developer.android.com

LifecycleOwenr란, 클래스에 Lifecycle이 있음을 나타내는 인터페이스이다.
즉, LifecycleOwner를 구현하는 구현체는 Lifecycle이 존재하고, 대표적으로 Activity, Fragment가 있다.
LifecycleOwner 인터페이스는 getLifecycle() 함수를 제공한다.
우리가 Activity, Fragment에서 DataBinding 등에 LifecycleOwner를 넘길 때 this를 사용할 수 있는 이유다.


왜 Fragment는 ViewLifecycleOwner가 따로 있나?

이것에 대한 이유는 Activity와 Fragment의 생명주기가 다르기 때문이다.
둘의 생명주기는 어떻게 다를까?

현재까지 본 생명주기를 정리한 이미지 중 가장 상세하다고 생각한다.
물론 그만큼 복잡하지만...
가장 큰 차이를 보자면, Fragment는 onViewCreated, onDestoryView 함수가 존재한다는 것이다.

즉, Activity는 화면이 나타나고 View가 그려지면, onDestory가 호출되기 전 까지 파괴되지 않는다.
즉, View의 생성과 파괴는 Activity와 흐름을 함께한다.

그러나, Fragment는 View가 그려지고 파괴됨을 반복하지만, 이것이 Fragemnt의 생성과 파괴에 의존되지는 않는다.
즉, Fragment의 생명주기와 View의 생명주기가 다르다는 것이다.

그렇기 때문에 View의 생명주기를 따로 관리하는, ViewLifecycleOwner가 존재하는 것이다.


Fragment에서 ViewLifecycleOwner를 사용하지 않으면 어떤 문제가 있을까?

우리가 LifecycleOwner, ViewLifecycleOwner를 사용하는 이유는 주로 LiveData의 사용일 것이다.
LiveData는 옵저버의 생명주기를 인식하여 데이터를 동기화할 수 있게 한다.

주로 ViewModel에서 API 호출이나 Local DB 등에서 데이터를 얻고,
이를 LiveData를 사용하여 Activity/Fragment 같은 LifecycleOwner가 구독한다.

이 때, 구독하는 Destory 상태가 아니면 값을 읽도록 설계되어 있다.
주로 값을 읽고 View를 업데이트하고 있을 것이다.

그럼 Fragment에서 LifecycleOwner를 사용하면 어떻게 될까?
Fragment의 LifecycleOwner는 Fragment가 Destory 되면 LiveData의 데이터 발행을 읽지 않을 것이다.
그런데 Fragment의 View가 Destory 되었다고 해서 Fragment가 Destory 상태가 아니라는 것이다.

즉, View가 파괴되어 Null이 되었는데 View를 업데이트 하는 시도를 할 수 있다는 것이다.
이는 앱에서 NPE를 발생시킬 가능성이 있다.

그렇기 때문에 Fragment에서는 ViewLifecycleOwner를 사용하여 LiveData를 구독해야 한다.

 

여기까지 LifecycleOwner에 대해 이해하고 Activity와 Fragment의 생명주기의 차이를 알아보았다.
그리고 그 차이로 인해 Fragment에서 ViewLifecycleOwner를 사용해야 하는 이유를 알아냈다.
Fragment에서 ViewLifecycleOwner를 사용하지 않는 것은 흔히 하는 실수이므로, 지금이라도 실수를 반복하지 말자.

반응형