일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 스택 큐 차이
- Rxjava Observable
- 안드로이드 os 구조
- ar vr 차이
- 객체
- 안드로이드 레트로핏 crud
- 2022 플러터 설치
- 안드로이드 레트로핏 사용법
- 자바 다형성
- 안드로이드 라이선스 종류
- 서비스 쓰레드 차이
- 서비스 vs 쓰레드
- rxjava hot observable
- 클래스
- 안드로이드 유닛 테스트
- 안드로이드 유닛테스트란
- ANR이란
- jvm이란
- rxjava disposable
- android retrofit login
- 플러터 설치 2022
- 스택 자바 코드
- 2022 플러터 안드로이드 스튜디오
- 안드로이드 유닛 테스트 예시
- 멤버변수
- android ar 개발
- rxjava cold observable
- 큐 자바 코드
- 안드로이드 라이선스
- jvm 작동 원리
- Today
- Total
나만을 위한 블로그
[MVVM] MutableLiveData와 LiveData 차이 본문
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는 식별 가능한(또는 관찰 가능한, Observable) 데이터 홀더 클래스입니다. 일반 식별 가능한 클래스와 달리 LiveData는 생명 주기를 인식합니다. 즉, 활동, 프래그먼트, 서비스 등 다른 앱 구성요소의 생명 주기를 고려합니다. 생명 주기 인식을 통해 LiveData는 액티비티 생명 주기 상태에 있는 앱 구성요소 관찰자만 업데이트합니다.
안드로이드의 생명주기를 인식하는 '식별 가능한' 데이터 홀더 클래스라고 한다. 이 LiveData라는 걸 이해하기 위해선 먼저 옵저버 패턴을 이해해야 할 것 같다.
onlyfor-me-blog.tistory.com/306
옵저버(관찰자) 패턴은 Subject(주제)라고 하는 객체가 Observer(관찰자)라는 종속 항목(위의 포스팅에선 인터페이스 이름이다)을 유지하고, 메서드 하나를 호출해 상태 변경을 자동으로 알리는 디자인 패턴이다.
위의 포스팅 기준으로, 내가 이해한 옵저버 패턴의 주요 로직은 Observer를 통해 최신 데이터에 대한 알림을 받거나, 상태 변경에 대한 소식을 듣는 것이다.
그리고 MVVM 디자인 패턴에서 관찰 가능한 데이터 홀더 클래스인 LiveData를 사용하니까, 이 패턴을 사용하면 매번 최신 데이터를 요청할 필요 없이 LiveData가 갖다 주는 최신 데이터를 뷰에 뿌리기만 하면 되는 것이다.
아직 LiveData에 대한 이해가 잘 되지 않은 기분이라 LiveData에 대해 설명하는 글들을 좀 더 찾아봤다.
www.journaldev.com/21168/android-livedata
LiveData는 아키텍처 패턴의 일부다. 기본적으로 기본/컬렉션(primitive/collection) 타입을 포함하는 데이터 홀더다. 뷰의 변경 사항을 관찰하고 ACTIVE일 경우에만 뷰를 업데이트하는 데 사용된다. 따라서 LiveData는 생명주기를 인식한다.
뷰모델만 사용하면 데이터가 뷰를 변경할 때마다 여러 번 호출되므로, 지루하고 비용이 많이 드는 작업이 될 수 있다.
또한 데이터 모델을 다른 위치에 저장해야 한다.
LiveData는 Observer 패턴을 기반으로하며 ViewModel과 View 간의 통신을 쉽게 한다. 여러 위치(SQLite, ArrayList, ViewModel)에서 데이터 참조를 추가 및 삭제하는 여러 호출을 수행하는 대신, 데이터 변경을 관찰하고 데이터를 자동으로 업데이트한다.
Android LiveData는 생명주기를 인식한다는 걸 빼면 RxJava와 다소 유사하다. 뷰가 백그라운드에 있으면 뷰의 데이터를 업데이트하지 않는다. 이는 IllegalStateException 같은 예외를 피하는 데 도움이 된다.
LiveData는 데이터를 저장하고 변화를 관찰할 수 있는 객체다. UI 객체는 LiveData에 옵저버를 등록할 수 있으며, 데이터가 바뀔 때 UI를 변경할 수 있다.
jeongupark-study-house.tistory.com/31
LiveData는 액티비티, 프래그먼트, 서비스의 생명주기를 따르는데, LiveData는 현재 활성화된 생명주기에 있는 앱 컴포넌트 옵저버만 업데이트하도록 보장한다. 즉 생명주기가 STARTED거나 RESUMED일 때 옵저버가 활성 상태인 것으로 간주하고, 이 활성화된 옵저버들에게만 LiveData 업데이트에 대한 알림을 준다. STARTED거나 RESUMED가 아닌 상태(비활성화 상태)일 때는 알림을 받지 않는다. DESTROYED 상태일 때는 옵저버가 삭제되도록 할 수 있기 때문에 메모리 누수에 대한 우려도 없다.
그럼 MutableLiveData는 뭘까? 이에 대해서도 인터넷을 찾아봤다.
stackoverflow.com/questions/52772884/difference-between-livedata-mutablelivedata
LiveData는 변하지 않지만(immutable) MutableLiveData는 변할 수 있다. MutableLiveData는 LiveData를 확장(extends)하고 setValue(), postValue() 같은 메서드를 제공한다.
www.reddit.com/r/androiddev/comments/gcl8vz/livedata_vs_mutablelivedata/
LiveData는 뷰모델 클래스 안에서만 수정할 수 있다는 점에서 변경할 수 없다. MutableLiveData를 사용하면 setValue() 및 postValue()를 쓸 수 있으므로 각각 기본 쓰레드, 백그라운드 쓰레드에서 값을 변경할 수 있다.
LiveData는 뭔가를 표시할 때에 사용하고, MutableLiveData는 뭔가를 설정/변경할 때에 사용하면 좋을 듯하다.
Room과 독립적으로 LiveData를 사용할 수 있지만 그렇게하려면 데이터 업데이트를 관리해야 한다. 그러나 LiveData에는 저장된 데이터를 업데이트하는 데 공개적으로 사용 가능한 메서드가 없다. 따라서 저장된 데이터를 업데이트하려면 LiveData 대신 MutableLiveData를 써야 한다.
MutableLiveData 클래스는 LiveData 객체의 값을 설정할 수있는 두 개의 공용 메서드인 setValue(T) 및 postValue(T)를 추가한다. MutableLiveData는 일반적으로 ViewModel에서 사용되며 ViewModel은 관찰자에게 변경 불가능한 LiveData 개체만 노출한다.
계속 setValue(), postValue()에 대한 이야기가 나와서 각 메서드들의 역할을 안드로이드 디벨로퍼에서 확인했다.
아래 링크 클릭 시 위의 메서드들에 대해 설명하는 문서로 이동한다.
developer.android.com/reference/androidx/lifecycle/MutableLiveData
이 LiveData를 사용하면 장점이 뭘까? 아무 장점도 없는데 개발자들이 사용하는 건 아닐 것이다.
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 |