안드로이드 앱을 개발하다가 보면, 현재 화면에 필요한 데이터들을 어떻게 관리하는게 좋을까 하는 고민거리가 생깁니다. 데이터들은 이전화면에서 받아온 extra 일수도 있고, SQLite/Preference/Server api 등 각기 다른 DataSource에서 가지고 올 것입니다.
Activity / Fragment의 전역변수로 가지고 있거나, ViewModel의 LiveData
해서 등장한 개념인 상태관리(State Management)
와 이를 개발자가 쉽게 구현해서 사용할 수 있도록 만든 프레임워크인 메버릭스(Mavericks)
를 소개해보는 시간을 가져볼까 합니다.
Mavericks를 구성하는 핵심 개념 3가지 - MavericksState
, MavericksViewModel
, MavericksView
- 에 대해서 알아보겠습니다. 이 3가지 개념들을 잘 조합하는것 만으로 견고한 Mavericks 프로젝트를 만들 수 있습니다.
State라고 표시해주는 interface으로, 상속 받은 클래스에서는 화면에 필요한 정보들을 가지고 있습니다. 다음과 같은 특징을 가집니다.
data class UserState(
val name: String = "사용자",
val age: Int = 27,
val regionName: String = "역삼1동",
val profileImageUrl: String? = null
) : MavericksState {
// derived proerites
val introduction: String
get() = "이름: $name, 나이: $age, 사는곳: $regionName"
}
MavericksViewModel은 화면회전 / LMK 등의 Configuration Changes가 발생할때, 데이터를 유지하기 위해서 Jetpack ViewModel
을 구현하는 형태로 사용하고 있습니다.
class UserViewModel(
initialState: UserState,
private val userRepository: UserRepository,
private val regionRepository: RegionRepository
) : MavericksViewModel<UserState>(initialState) {
companion object : MavericksViewModelFactory<UserViewModel, UserState> {
override fun initialState(viewModelContext: ViewModelContext): MyState {
return MyState(...)
}
override fun create(viewModelContext: ViewModelContext, state: MyState): MyViewModel {
return MyViewModel(state, ...)
}
}
}