Group Study (2023-2024)/Android 심화

[Android 심화] 4주차 스터디 - AAC ViewModel

푸리우 2023. 11. 27. 20:08

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의 생명주기

Activity와 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

https://velog.io/@ashwon1218/Android-JetPack-ViewModel%EC%9D%B4%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80

https://charlezz.medium.com/viewmodel%EC%9D%B4%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80-viewmodel-%EC%B4%88%EB%B3%B4%EB%A5%BC-%EC%9C%84%ED%95%9C-%EA%B0%80%EC%9D%B4%EB%93%9C-e1be5dc1ac18