ViewModel 이란?
- ViewModel은 안드로이드 아키텍처 컴포넌트 중 하나로, UI 관련 데이터를 관리하는 클래스
- 액티비티(Activity)나 프래그먼트(Fragment)가 변경되거나 소멸되더라도 데이터를 유지할 수 있도록 도와준다.
ViewModel의 주요 역할
- UI 데이터를 유지
- 화면 회전과 같은 구성 변경(Configuration Change) 시에도 데이터가 유지된다.
- 액티비티나 프래그먼트가 재생성되더라도 데이터가 초기화되지 않는다.
- UI 로직과 비즈니스 로직을 분리
- UI(View)는 ViewModel에 있는 데이터를 관찰(Observe)하면서 화면을 업데이트한다.
- 데이터 처리를 ViewModel 에서 담당하므로 코드의 재사용성과 테스트 가능성이 높아진다.
- LiveData 또는 StateFlow와 함께 사용 가능
- LiveDate 또는 StateFlow를 사용하면 UI에서 데이터 변화를 감지하여 자동으로 업데이트할 수 있다.
ViewModel의 특징과 장점
특징 | 설명 |
UI 데이터를 유지 | 화면 회전 시에도 데이터가 초기화되지 않음 |
수명 주기와 연동 | ViewModel은 액티비티/프래그먼트의 수명 주기와 독립적 |
비즈니스 로직 분리 | UI 로직과 데이터 로직을 분리하여 코드의 재사용성과 유지보수성을 높임 |
LiveData 또는 StateFlow 활용 가능 | LiveData, Flow와 함께 사용하여 데이터 변경을 UI에 반영 가능 |
ViewModel 사용 예제
class MyViewModel : ViewModel() {
private val _count = MutableLiveData<Int>(0) // 변경 가능한 데이터
val count: LiveData<Int> = _count // UI에서 관찰할 데이터
fun increaseCount() {
_count.value = (_count.value ?: 0) + 1
}
}
class MainActivity : AppCompatActivity() {
private lateinit var viewModel: MyViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
viewModel = ViewModelProvider(this).get(MyViewModel::class.java)
viewModel.count.observe(this) { newValue ->
textView.text = newValue.toString()
}
button.setOnClickListener {
viewModel.increaseCount()
}
}
}
ViewModel과 RoomDB 활용 예시
@HiltViewModel
class ChatViewModel @Inject constructor(
private val chatRepository: ChatRepository
) : ViewModel() {
val chatMessages: LiveData<List<ChatMessage>> = chatRepository.getAllMessages()
fun sendMessage(message: ChatMessage) {
viewModelScope.launch {
chatRepository.insertMessage(message)
}
}
}
'android studio' 카테고리의 다른 글
[Android] 디자인 패턴 비교 (MVC, MVP, MVVM, MVI) (0) | 2025.02.21 |
---|---|
[Android] MVVM (Model-View-ViewModel) 디자인 패턴 (0) | 2025.02.20 |
[Android] remember / mutableStateOf 사용법 (Jetpack Compose) (0) | 2025.02.18 |
[Android] LazyColumn / LazyRow 사용법 (Jetpack Compose) (0) | 2025.02.17 |
[Android] Spacer / Divider 사용법 (Jetpack Compose) (0) | 2025.02.15 |