관리 메뉴

나만을 위한 블로그

[MVVM] MutableLiveData와 LiveData 차이 본문

개인 공부/디자인 패턴

[MVVM] MutableLiveData와 LiveData 차이

참깨빵위에참깨빵 2021. 4. 24. 20:58
728x90
반응형

MVVM으로 코드를 리팩토링하던 중 LiveData와 MutableLiveData라는 이름이 비슷한 두 클래스를 알게 됐다.

앞에 Mutable이 붙었을 뿐이고 사용법도 비슷하지만 둘의 차이를 알고 넘어가고 싶어서 이 포스팅을 쓰게 됐다.

 

먼저 Mutable의 사전적 정의는 아래와 같다.

mutable : 변할 수 있는, 잘 변하는

스타크래프트 게임에는 저그라는 종족이 있는데, 이 종족으로 플레이할 시 뽑을 수 있는 공중 유닛 중에서 뮤탈리스크(Mutalisk)라는 유닛이 있다.

또한 좀비 게임이나 괴생명체가 등장하는 게임에서 간혹 뮤턴트(Mutant)라는 이름이 붙은 몬스터를 본 기억이 있다.

여기서 "mut"라는 단어는 라틴어 Mutate가 어원인데, to change(~을 바꾸다, 변화시키다, 변경시키다)라는 뜻이 있다.

 

본론으로 돌아와서, mutable이 붙었다는 건 결국 변하는 성질이 있기 때문에 붙은 것이라고 생각한다.

mutable의 의미는 알겠다 치고, LiveData는 뭘까? LiveData는 두 단어의 조합이기 때문에 각 단어의 사전적 정의를 찾아봤다.

live : (특정 장소에서) 살다, 거주하다, 지내다 / (죽지 않고) 살다, 생존하다 / 살아 있는
data : (증명, 판단, 결정 등을 위한) 자료 / (컴퓨터에 저장된) 자료, 데이터, 정보

단순하게 두 단어를 이어 붙이면 '살아 있는 정보' 정도의 뜻이 된다.

정보가 왜 살아있을까? 애초에 '살다' 라는 단어의 정확한 의미가 뭘까?

살다 : 생명을 지니고 있다

그냥 어디 한 군데에 있거나 내가 짠 코드에 따라 위치를 바꾸고 보여지기만 할 뿐인 데이터가 생명을 지니고 있다는 건가? 생각하면 할수록 점점 이상한 방향으로 빠지는 것 같다. 다른 문서를 확인해보자.

 

 

안드로이드 공식 홈페이지에서는 LiveData에 대해 아래와 같이 말하고 있다.

developer.android.com/topic/libraries/architecture/livedata?hl=ko

 

LiveData 개요  |  Android 개발자  |  Android Developers

LiveData를 사용하여 수명 주기를 인식하는 방식으로 데이터를 처리합니다.

developer.android.com

LiveData는 식별 가능한(또는 관찰 가능한, Observable) 데이터 홀더 클래스입니다. 일반 식별 가능한 클래스와 달리 LiveData는 생명 주기를 인식합니다. 즉, 활동, 프래그먼트, 서비스 등 다른 앱 구성요소의 생명 주기를 고려합니다. 생명 주기 인식을 통해 LiveData는 액티비티 생명 주기 상태에 있는 앱 구성요소 관찰자만 업데이트합니다.

안드로이드의 생명주기를 인식하는 '식별 가능한' 데이터 홀더 클래스라고 한다. 이 LiveData라는 걸 이해하기 위해선 먼저 옵저버 패턴을 이해해야 할 것 같다.

onlyfor-me-blog.tistory.com/306

 

[Android] 관찰자(Observer) 패턴이란?

냅뒀던 MVVM 패턴 공부를 다시 하려고 예제를 찾아서 분석하던 도중 MutableLiveData를 발견했다. 이게 아니라도 LiveData라는 키워드를 써서 LiveData > 형태로 사용하는 예제 코드가 정말 많았다. 이게 뭔

onlyfor-me-blog.tistory.com

옵저버(관찰자) 패턴은 Subject(주제)라고 하는 객체가 Observer(관찰자)라는 종속 항목(위의 포스팅에선 인터페이스 이름이다)을 유지하고, 메서드 하나를 호출해 상태 변경을 자동으로 알리는 디자인 패턴이다.

위의 포스팅 기준으로, 내가 이해한 옵저버 패턴의 주요 로직은 Observer를 통해 최신 데이터에 대한 알림을 받거나, 상태 변경에 대한 소식을 듣는 것이다.

그리고 MVVM 디자인 패턴에서 관찰 가능한 데이터 홀더 클래스인 LiveData를 사용하니까, 이 패턴을 사용하면 매번 최신 데이터를 요청할 필요 없이 LiveData가 갖다 주는 최신 데이터를 뷰에 뿌리기만 하면 되는 것이다.

 

아직 LiveData에 대한 이해가 잘 되지 않은 기분이라 LiveData에 대해 설명하는 글들을 좀 더 찾아봤다.

 

www.journaldev.com/21168/android-livedata

 

Android LiveData - JournalDev

Android LiveData Example, Android LiveData Tutorial, Android LiveData vs RxJava, LiveData vs MutableLiveData, Android LiveData Observer example, Android LiveData vs ViewModel, Android Studio LiveData Example Project Downlaod source code.

www.journaldev.com

LiveData는 아키텍처 패턴의 일부다. 기본적으로 기본/컬렉션(primitive/collection) 타입을 포함하는 데이터 홀더다. 뷰의 변경 사항을 관찰하고 ACTIVE일 경우에만 뷰를 업데이트하는 데 사용된다. 따라서 LiveData는 생명주기를 인식한다.
뷰모델만 사용하면 데이터가 뷰를 변경할 때마다 여러 번 호출되므로, 지루하고 비용이 많이 드는 작업이 될 수 있다.
또한 데이터 모델을 다른 위치에 저장해야 한다.
LiveData는 Observer 패턴을 기반으로하며 ViewModel과 View 간의 통신을 쉽게 한다. 여러 위치(SQLite, ArrayList, ViewModel)에서 데이터 참조를 추가 및 삭제하는 여러 호출을 수행하는 대신, 데이터 변경을 관찰하고 데이터를 자동으로 업데이트한다.
Android LiveData는 생명주기를 인식한다는 걸 빼면 RxJava와 다소 유사하다. 뷰가 백그라운드에 있으면 뷰의 데이터를 업데이트하지 않는다. 이는 IllegalStateException 같은 예외를 피하는 데 도움이 된다.

 

leveloper.tistory.com/147

 

[Android] Jetpack LiveData란?

LiveData란?  LiveData는 데이터를 저장하고 변화를 관찰 할 수 있는 객체이다. UI객체는 LiveData에 옵저버를 등록할 수 있으며 데이터가 변경될 때 UI를 변경할 수 있다.  예를 들어, 아래처럼 LiveData를

leveloper.tistory.com

LiveData는 데이터를 저장하고 변화를 관찰할 수 있는 객체다. UI 객체는 LiveData에 옵저버를 등록할 수 있으며, 데이터가 바뀔 때 UI를 변경할 수 있다.

 

jeongupark-study-house.tistory.com/31

 

Android -LiveData

Android Developer에서 설명하는 LiveData란 관찰기능한(Observable) 데이터 홀더 클래스입니다. 간단히 설명하면 Activity나 Fragment, service의 life cycle을 따르는데, LiveData는 현재 활성화된 생명주기에..

jeongupark-study-house.tistory.com

LiveData는 액티비티, 프래그먼트, 서비스의 생명주기를 따르는데, LiveData는 현재 활성화된 생명주기에 있는 앱 컴포넌트 옵저버만 업데이트하도록 보장한다.생명주기가 STARTED거나 RESUMED일 때 옵저버가 활성 상태인 것으로 간주하고, 이 활성화된 옵저버들에게만 LiveData 업데이트에 대한 알림을 준다. STARTED거나 RESUMED가 아닌 상태(비활성화 상태)일 때는 알림을 받지 않는다. DESTROYED 상태일 때는 옵저버가 삭제되도록 할 수 있기 때문에 메모리 누수에 대한 우려도 없다.

 

그럼 MutableLiveData는 뭘까? 이에 대해서도 인터넷을 찾아봤다.

 

stackoverflow.com/questions/52772884/difference-between-livedata-mutablelivedata

 

Difference between LiveData, MutableLiveData

I know that the MutableLiveData extends LiveData, but what is the difference between them (in usage). What are appropriate use cases, means when to use the correct one from the two?

stackoverflow.com

LiveData는 변하지 않지만(immutable) MutableLiveData는 변할 수 있다. MutableLiveData는 LiveData를 확장(extends)하고 setValue(), postValue() 같은 메서드를 제공한다.

 

www.reddit.com/r/androiddev/comments/gcl8vz/livedata_vs_mutablelivedata/

 

LiveData vs MutableLiveData

This may seem like a stupid question but i'm trying to learn MVVM pattern and something is confusing me: In ViewModel class, we put an attribute...

www.reddit.com

LiveData는 뷰모델 클래스 안에서만 수정할 수 있다는 점에서 변경할 수 없다. MutableLiveData를 사용하면 setValue() 및 postValue()를 쓸 수 있으므로 각각 기본 쓰레드, 백그라운드 쓰레드에서 값을 변경할 수 있다.

LiveData는 뭔가를 표시할 때에 사용하고, MutableLiveData는 뭔가를 설정/변경할 때에 사용하면 좋을 듯하다.

 

google-developer-training.github.io/android-developer-fundamentals-course-concepts-v2/unit-4-saving-user-data/lesson-10-storing-data-with-room/10-1-c-room-livedata-viewmodel/10-1-c-room-livedata-viewmodel.html

 

10.1: Room, LiveData, and ViewModel · GitBook

10.1: Room, LiveData, and ViewModel Contents: What are Android Architecture Components? The Android OS manages resources aggressively to perform well on a huge range of devices, and sometimes that makes it challenging to build robust apps. Android Architec

google-developer-training.github.io

Room과 독립적으로 LiveData를 사용할 수 있지만 그렇게하려면 데이터 업데이트를 관리해야 한다. 그러나 LiveData에는 저장된 데이터를 업데이트하는 데 공개적으로 사용 가능한 메서드가 없다. 따라서 저장된 데이터를 업데이트하려면 LiveData 대신 MutableLiveData를 써야 한다.
MutableLiveData 클래스는 LiveData 객체의 값을 설정할 수있는 두 개의 공용 메서드인 setValue(T) 및 postValue(T)를 추가한다. MutableLiveData는 일반적으로 ViewModel에서 사용되며 ViewModel은 관찰자에게 변경 불가능한 LiveData 개체만 노출한다.

계속 setValue(), postValue()에 대한 이야기가 나와서 각 메서드들의 역할을 안드로이드 디벨로퍼에서 확인했다.

아래 링크 클릭 시 위의 메서드들에 대해 설명하는 문서로 이동한다.

developer.android.com/reference/androidx/lifecycle/MutableLiveData

 

MutableLiveData  |  Android 개발자  |  Android Developers

MutableLiveData public class MutableLiveData extends LiveData java.lang.Object    ↳ androidx.lifecycle.LiveData      ↳ androidx.lifecycle.MutableLiveData Known direct subclasses MediatorLiveData LiveData subclass which may observe other LiveData

developer.android.com

 

이 LiveData를 사용하면 장점이 뭘까? 아무 장점도 없는데 개발자들이 사용하는 건 아닐 것이다.

google-developer-training.github.io/android-developer-fundamentals-course-concepts-v2/unit-4-saving-user-data/lesson-10-storing-data-with-room/10-1-c-room-livedata-viewmodel/10-1-c-room-livedata-viewmodel.html

 

10.1: Room, LiveData, and ViewModel · GitBook

10.1: Room, LiveData, and ViewModel Contents: What are Android Architecture Components? The Android OS manages resources aggressively to perform well on a huge range of devices, and sometimes that makes it challenging to build robust apps. Android Architec

google-developer-training.github.io

1. UI가 데이터 상태와 일치하는지 확인한다 : LiveData는 옵저버 패턴을 따르므로 생명주기 상태가 바뀔 때 옵저거 객체에 알린다. 코드를 통합해서 이런 옵저버 객체 안에서 UI를 업데이트할 수 있다. 앱 데이터가 바뀔 때마다 UI를 업데이트하는 대신, 옵저버는 상태가 변경될 때마다 UI를 업데이트할 수 있다.

2. 메모리 누수가 없다 : 옵저버는 생명주기 객체에 바인딩되며 옵저버는 관련된 생명주기가 파괴되면 스스로 정리된다.

3. 중지된 액티비티로 인한 충돌이 없다 : 옵저버의 생명주기가 백스택 안의 액티비티처럼 비활성 상태면 LiveData 이벤트를 받지 않는다.

4. 직접 생명주기를 처리할 필요가 없다 : UI 구성 요소는 관련 데이터만 관찰하고 관찰을 중지하거나 재개하지 않는다. LiveData는 관찰하는 동안 관련된 생명주기 상태 변경을 인식하므로, LiveData는 관찰 중지 및 재개를 자동으로 관리한다.

5. 데이터가 항상 최신 상태다 : 생명주기가 비활성화되면 다시 활성화될 때 최신 데이터를 수신한다. 예를 들어 백그라운드에 있던 액티비티는 포그라운드로 돌아온 직후 최신 데이터를 받는다.

6. 구성 변경이 올바르게 처리된다 : 장치 회전 같은 구성 변경으로 인해 액티비티/프래그먼트가 다시 생성되는 경우, 액티비티/프래그먼트는 즉시 사용 가능한 최신 데이터를 받는다.

7. 자원이 공유될 수 있다 : 싱글턴 패턴을 써서 LiveData 객체를 확장할 수 있다. 예를 들어 서비스, DB의 경우 LiveData 객체는 시스템 서비스에 한 번 연결되고 자원이 필요한 모든 옵저버는 LiveData를 볼(watch) 수 있다.

 

정리

  • LiveData는 앱의 생명주기가 활성화(STARTED, RESUME) 상태인 옵저버들에게만 최신 상태의 데이터를 줘서 UI가 항상 최신 데이터만 갖도록 한다. 이 값은 변하지 않는다. 즉, LiveData를 쓰는 목적은 옵저버가 활성화 상태일 때 최신 값을 UI로 보내기 위함이다.
  • MutableLiveData는 LiveData와 달리 변할 수 있는 값을 가지며, 메인 쓰레드 또는 백그라운드 쓰레드에서 MutableLiveData의 값을 바꿀 수 있다.
  • MutableLiveData는 LiveData를 상속한 클래스다. 또한 LiveData에 없는 setValue(), postValue()를 갖고 있으며 개발자는 이를 사용할 수 있다.
반응형

'개인 공부 > 디자인 패턴' 카테고리의 다른 글

빌더(Builder) 패턴이란?  (0) 2022.01.02
팩토리 패턴이란?  (0) 2021.10.05
[Android] 관찰자(Observer) 패턴이란?  (0) 2021.04.11
MVC 패턴이란?  (0) 2020.11.27
자바 - 퍼사드 패턴(Facade Pattern)이란?  (0) 2020.11.25
Comments