와챠의 우당탕탕 코딩 일기장

[Android] Android Architecture Components(AAC)/안드로이드 아키텍처 컴포넌트 - 3. ViewModel 본문

코딩 일기장/Android(Kotlin)

[Android] Android Architecture Components(AAC)/안드로이드 아키텍처 컴포넌트 - 3. ViewModel

minWachya 2022. 6. 2. 16:00
반응형
  1. Lifecycle (Easy handling lifecycles)
  2. LiveData (Lifecycle aware observable)
  3. ViewModel (Managing data in a lifecycle)
  4. Room (Object Mapping for SQLite)
  5. Paging (Gradually loading information)

3. ViewModel

 

공식 문서

 

ViewModel 개요  |  Android 개발자  |  Android Developers

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

developer.android.com

 

 

 

ViewModel이란 무엇인가?

공식 문서의 설명을 보면 아래와 같다.

ViewModel 클래스는 수명 주기를 고려하여 UI 관련 데이터를 저장하고 관리하도록 설계되었습니다. 
ViewModel 클래스를 사용하면 화면 회전과 같이 구성을 변경할 때도 데이터를 유지할 수 있습니다.

 

ViewModel은 왜 쓰는가?

화면 회전 시(Destroy->Create) 기존의 데이터가 없어지는 문제는 기존에는 saveInstanceState를 통해 해결했는데,

여기에는 몇가지 문제가 있다:

  • 담을 수 있는 데이터가 적고, 형태가 제한된다.
  • onCreate에서 작업을 처리해야 하므로 UI 컨트롤러(UI 데이터 준비 당담)가 해야 할 일이 늘어나며 화면을 띄우는데 시간이 오래 걸린다.

이 문제를 해결하기 위해 나온 것이 ViewModel이다.

 

 

ViewModel은 어떻게 사용하는가?

 

1. ViewModel class 만들기

// ViewModel 객체는 구성이 변경되는 동안 자동으로 보관됨
// 아래 코드 예시) 앱에서 User 목록을 표시해야 할 때
class MyViewModel : ViewModel() {
	// User 목록을 확보하여 Activity나 Fragment 대신 ViewModel에 보관하도록!!!
    private val users: MutableLiveData<List<User>> by lazy {
        MutableLiveData<List<User>>().also {
            loadUsers()
        }
    }

    fun getUsers(): LiveData<List<User>> { return users }

    private fun loadUsers() {
        // ~비동기적으로 User 가져오기~
    }
}

 

2. Activity에서 접근하기

class MyActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
    	// onCreate() 호출 시 ViewModel 생성
        // 다시 onCreate() 호출될 때는 처음에 생성한 MyViewModel의 인스턴스를 받게 됨
        val model: MyViewModel by viewModels()
        model.getUsers().observe(this, Observer<List<User>>{ users ->
            // update UI
        })
    }
}

 

 

+ ViewModel의 수명주기

ViewModel은

Activity: Activity 끝날 때까지

Fragment: Fragment가 분리될 때까지 메모리에 남아 있다.

 

+ Fragment 간 데이터 공유

두 Fragment는 모두 자신이 포함된 Activity을 검색합니다.

그러면 각 Fragment ViewModelProvider를 가져와 동일한 SharedViewModel 인스턴스를 받는다.

class SharedViewModel : ViewModel() {
    val selected = MutableLiveData<Item>()

    fun select(item: Item) {
        selected.value = item
    }
}

class ListFragment : Fragment() {
    private lateinit var itemSelector: Selector

    private val model: SharedViewModel by activityViewModels()

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        itemSelector.setOnClickListener { item ->
            // Update the UI
        }
    }
}

class DetailFragment : Fragment() {
    private val model: SharedViewModel by activityViewModels()

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        model.selected.observe(viewLifecycleOwner, Observer<Item> { item ->
            // Update the UI
        })
    }
}

참고

https://todaycode.tistory.com/33

 

안드로이드 View Model(뷰 모델)을 공부해보자!

1. ViewModel  1-1. ViewModel 이란?  1-2. 탄생 배경  1-3. 사용하는 이유 2. 사용법  2-1. gradle 추가  2-2. Layout 파일  2-3. ViewModel 파일  2-4. Activity 파일 3. 주의할 점  3-1. 참조 1. View..

todaycode.tistory.com


ViewModel 맨날 이게 뭐지 헸었는데 이런 거였구나,,,

화면 회전될 때 데이터 유지라던가, 프레그먼트간 데이터 전달을 정말 간편하다는 생각이 든다.

 

지금 하는 플젝도 프레그먼트간 데이터 이동을 해야하는 경우가 있었는데,,,

그걸 이 방법으로 다시 만들어볼까 한다!!!

그동안은 Bundle을 통해서 데이터를 주고받았었는데 이거 보니까 넘 편해보임

반응형
Comments