ViewModel이란?
business logic or screen level state holder
It exposes state to the UI and encapsulates related business logic.
Android Jepack의 구성요소 중 하나로 Activity와 fragment와 같은 UI 컨트롤러의 로직에서 데이터를 다루는 로직을 분리하기 위해 만들어졌다.
본래 ViewModel이란 이름은 소프트웨어 개발 디자인 패턴 중 하나인 MVVM(Model - View - ViewModel) 디자인 패턴으로부터 파생되었다. 이 글에서 설명할 ViewModel은 AAC(Android Architecture Components) ViewModel이다.
ViewModel의 생명주기
ViewModel은 Activity에서는 Activity가 완전히 종료될 때까지, 그리고 Fragment에서는 Fragment가 분리될 때까지 메모리에 남아있도록 설계되어있다. 그렇기 때문에 Configuration 변경이(예:화면 회전) 발생할 때 Activity는 다시 시작되지만 ViewModel은 여전히 메모리 상에 남아있어 데이터를 유지할 수 있다.
ViewModel 구현하기
build.gradle 파일에 아래 종속 항목을 추가한다.
implementation 'androidx.lifecycle:lifecycle-viewmodel-compose:2.5.1'
아래 코드와 같이 viewModel() 함수를 호출하여 컴포저블에서 ViewModel에 접근할 수 있다.
class MyViewModel : ViewModel() { /*...*/ }
@Composable
fun MyScreen(
viewModel: MyViewModel = viewModel()
) {
// use viewModel here
}
아래 실습 코드를 보면 ViewModel에서는 Note의 state를 관리하여 Note를 추가, 삭제 또 저장되어 있는 Note를 가져온다.
class NoteViewModel:ViewModel() {
private var noteList= mutableStateListOf<Note>()
init{
noteList.addAll(NotesDataSource().loadNotes())
}
fun addNote(note:Note){
noteList.add(note)
}
fun removeNote(note:Note){
noteList.remove(note)
}
fun getAllNotes():List<Note>{
return noteList
}
}
이렇게 만든 ViewModel을 아래와 같이 Composable에서 사용한다.
@Composable
fun NotesApp(noteViewModel: NoteViewModel=viewModel()){
val notesList=noteViewModel.getAllNotes()
NoteScreen(notes= notesList,
onAddNote = {noteViewModel.addNote(it)},
onRemoveNote = { noteViewModel.removeNote(it) }
)
}
참고자료:
https://developer.android.com/topic/libraries/architecture/viewmodel?hl=en
https://developer.android.com/jetpack/compose/libraries?hl=ko
'Group Study (2023-2024) > Android 심화' 카테고리의 다른 글
[Android 심화] 5주차 스터디 - 의존성 주입(DI), Hilt, Room (0) | 2023.12.20 |
---|---|
[Android 심화] 3주차 스터디 - Movie App 만들기(Scaffold, LazyColumn, Navigation) (1) | 2023.11.20 |
[Android 심화] 2주차 스터디 - Jetpack Compose 입문(2) (1) | 2023.11.13 |
[Android 심화] 1주차 스터디 - Jetpack Compose 입문(1) (1) | 2023.11.06 |