Android

(Android) - MVVM 패턴 (ViewModel, LiveData, Observer)

돗개진 2024. 6. 26. 14:02

[ MVVM 패턴 ] = Model + View + ViewModel

- 안드로이드 아키텍처 패턴 중 하나

- 사용자(Action) -> View(MainActivity) -> ViewModel(ViewModel Class) -> Model(Repository Database)

 

View (Activity / Fragment)

- 액티비티 / 프래그먼트

- 유저의 UI 컴포넌트 Action 처리 + UI 이벤트 Action 처리를 받으며 UI 관련 로직을 실행함

- View가 ViewModel을 Observe 하고 있기 때문에 View가 변경된 데이터를 갱신할 수 있도록 LiveData를 사용해야 함

- LiveData 객체와 observe (ex: viewmodel.event.observe(this) { data update 처리 Logic (UI 로직 등) } )

 

*LiveData : 생명주기를 알고 있기 때문에 데이터의 변경에 따라 LiveData와 연결된 뷰가 Destroy 되면 메모리가 알아서 해제됨 (따로 생명주기 처리를 하지 않아도 됨)

 

*LiveData 객체 생성 예시 (데이터 변경이 일어날 때마다 객체에게 알려 줌)

-> private val _event : MutableLiveData<DataClass> = MutableLiveData()

-> val event : LiveData<DataClass> get() = _event (액티비티에서 가져올 LiveData 값 설정)

 

*StateFlow (LiveData 대신 사용할 수 있다)

: LiveData 와 유사하게 상태 값을 Observe하여 UI 상태를 관리할 수 있음. 그러나 LiveData와 다르게 생명 주기를 인식하지 않는다는 차이점이 있음. (일반적으로 StateFlow는 ViewModel에서 사용하고 Flow는 Dao 같은 데이터 흐름 처리에 사용)

 

ViewModel (Class)

- LiveData를 ViewModel의 Data로 액티비티가 가져감

- 비지니스 로직 처리 데이터를 ViewModel이 가지고 Observe를 통해서 View(Activity, Fragment)에 업데이트 해 줌

 

*비지니스 로직 : 눈에 보이지 않는 데이터 처리, 기능 처리 등 (앱에 가치를 부여하는 요소로 앱의 데이터 생성, 저장, 변경 방식을 결정하는 규칙으로 구성)

 

*Observe : 데이터 Change + UI 변경 사항 업데이트를 위해 사용됨 (옵저버 패턴 : 변경 사항을 감시하다 변경이 감지되면 그에 따른 변경 사항을 업데이트하는 처리를 함)

 

Model (Repository Database)

 


 

[ ViewModel 코드 ]

 

LiveData

- 데이터의 변경을 관찰 가능

: 데이터가 변경될 때마다 이를 자동으로 UI에 반영함

 

- 생명 주기를 알고 있음

: LiveData는 생명 주기 인식(Lifecycle-aware) 컴포넌트로 UI 컨트롤러(Activity, Fragment 등)의 생명 주기를 자동으로 인식함

 

- LiveData랑 연결된 뷰가 Destroiy 되면 메모리가 알아서 해제됨 (따라서 생명 주기 처리를 하지 않아도 됨)

 

LiveData 객체 생성 (데이터 변경이 일어날 때마다 객체에게 알려 줌)

private val _event : MutableLiveData<DataClass> = MutableLiveData()
val event : LiveData<DataClass> get() = _event

=> MutableLiveData 객체인 _event 를 생성하여 데이터를 변경할 수 있게 함. LiveData 객체인 event 를 외부에서 접근할 수 있도록 제공하여 변경할 수 없지만 관찰할 수 있게 함 (캡슐화를 통해 데이터의 무분별한 변경 방지)

 

[ Activity or Fragment 코드 ]

 

LiveData 객체 Observe 방법

viewmodel.event.observe(this) { data update 처리 Logic (UI 로직 등) }

=> viewmodel 에 생성한 event 변수를 observe 함. 여기서 viewmodel 의 event 변수는 LiveData 타입으로 선언된 상태이기 때문에 데이터 변경이 일어나는 것을 감지하고 그에 따라 관련된 로직(UI 로직 등)들을 처리할 수 있음.