[Kotlin, Android] 화면 전환 시 데이터가 사라지는 문제 해결, View Model 이용하기

 

[문제 발생]

 

android 개발 중 화면 전환을 하게 되면 데이터가 사라지는 문제가 발생했다.

데이터가 초기화 되면서 기존의 데이터가 사라지는 현상인데 이를 해결하기 위한 방법이 필요했다.

 

 

[해결 방안]

가장 좋은 방법은 View Model을 사용하는 것이다.

이전에 개발을 할 때 다른 fragment에 다녀 올 때 fragment의 생명주기가 Destroy 상태가 된다면 

기존의 데이터들을 잃는 상황이 발생 했었다. 하지만 이 뷰 모델 기능을 사용하면 

화면 전환시 데이터가 사라지는 문제, 다른 fragment에 다녀온 후 데이터가 사라지는 문제를 해결할 수 있다.

 

view model의 생명주기

 

 

<step 1> 라이브러리 등록과 view model class 제작하기

 

view model 관련 개발 가이드 출처 : ViewModel 개요  |  Android 개발자  |  Android Developers

 

ViewModel 개요  |  Android 개발자  |  Android Developers

ViewModel을 사용하면 수명 주기를 인식하는 방식으로 UI 데이터를 관리할 수 있습니다.

developer.android.com

 

ToDoMainViewModel 이라는 class를 선언 해주었다. 

액티비티에서 해당 모델을 선언하면 fragment에서의 데이터들을 유지할 수 있다.

아래의 뷰 모델은 액티비티가 종료될 때 제거 된다.

 

class ToDoMainViewModel : ViewModel(){
    //데이터를 관리하는 곳
}

 

아래와 같이 todoData를 view model 내부에서 선언해 주었다. 

이 엑티비티와 관련된 fragment 들은 viewmodel 내부의 todoData를 이용할 수 있을 뿐 아니라

addData , delData, changeDate 등 제작한 함수도 사용할 수 있다.

private var todoData = ArrayList<Todo>()

fun addData(text:String){
    todoData.add(Todo(text, false))
 
}

fun delData(todo: Todo){
    todoData.remove(todo)
   
}
fun changeData(todo:Todo){
    todo.isDone = !todo.isDone
   
}

<step 2> mainActivity에서 viewmodel 사용하기

 

우선 mainActivity에서 앞에서 만들어둔 view model을 선언후 초기화 해준다.

 

 private val viewModel : ToDoMainViewModel by viewModels() // 뷰 모델 선언, 초기화

 

이제 초기화한 view model을 바로 사용할 수 있다.

사용하는 방법은 매우 간단하다  직접 viewmodel의 데이터를 아까 제작한 addData,delDate 등으로

조작하면 된다.

 

editText의 데이터를 viewModel에 추가하는 코드이다. 

viewModel.addData(binding.editText.text.toString())

 

[리뷰]

 

fragment 간에 이동 시 기존 데이터가 유지되었으면 좋겠다는 생각에 방법을 찾아보았다.

이렇게 매우 편리한 기능을 알게 되었으니 앞으로의 코드가 더 간결해 질 수 있을 것 같다.