[ 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 로직 등)들을 처리할 수 있음.
'Android' 카테고리의 다른 글
(Android) - MVC, MVP, MVI 패턴의 이해 및 장단점 (0) | 2024.08.24 |
---|---|
(Android / Kotlin) - Room 을 사용한 데이터 유지 (0) | 2024.08.16 |
(Android / Kotlin) - SharedPreferences (2) | 2024.04.30 |
(Android Studio) - Dialog 사용하기 (0) | 2024.04.23 |
(Android Studio) - 프래그먼트의 데이터 전달 (0) | 2024.04.17 |