본문 바로가기

Kotlin_study/CodeLab

[Codelab] LiveData에 대해 이해하기(+ DataBinding)

목차
1. 공부 이유

2. LiveData란?

3. DataBinding이란?

4. 후기, 이후 계획

5. 참고문헌

 

1. 공부 이유

ViewModel에 대해 학습하며 LiveData에 대해 학습할 필요성을 느껴서 학습하게 되었다. ViewModel만으로는 데이터 변경사항을 감지하고 이를 UI에 반영하는게 아니고 UI Controller에서 데이터 조작에 관한 책임을 분리하는 수단이었기 때문이다. 그 과정에서 DataBinding의 개념도 같이 등장하여 이도 함께 학습하는 시간을 가졌다. 

 

참고 Codelab 링크

Use LiveData with ViewModel (android.com)


2. LiveData 란?

LiveData는 데이터를 보유하며, 수명 주기를 인식하는, 관찰 가능한 클래스이다. 

1) 데이터 보유 : 모든 유형의 데이터에 적용 가능

2) 수명 주기 인식 : LiveData에 관찰자를 연결하면 관찰자는 LifecycleOwner와 연결되어 STARTED, RESUMED 활성화된 상태인 관찰자만 업데이트 된다.

3) 관찰 가능한 : LiveData 객체가 보유한 데이터가 변경되면 관찰자에 전달된다.

 

//MutableLiveData : 내부의 데이터를 변경 가능한 LiveData
//객체의 값이 바뀌는게 아니라 객체에 저장된 데이터가 변경되는 것이므로 val로 선언
private val _currentWord = MutableLiveData<String>()

//외부에서(Activity, Fragment)에서 변경해서 안되므로 LiveData로  
val currentWord : LiveData<String>
	get() = _currentWord

//단어 카운트 개수를 1 증가시키는 함수
private fun increaseCount(){
	_currentWord.value?.inc()
}

이전 포스팅에서 데이터를 관리했던 것처럼 ViewModel에서 조작할 데이터는 private으로 선언하고 외부에서는 getter를 통해 이를 활용할 수 있게끔 한다. 

그리고 ViewModel에서 data를 조작하기 위해서는 increaseCount()와 같이 변수명.value를 통해 데이터에 접근하여 조작할 수 있다.

//GameFragment.kt
viewModel.currentWordCount.observe(viewLifecycleOwner, {
	newWordCount ->
    	binding.wordCount.text = getString(R.string.word_count, newWordCount)
})

currentWordCount에 observe()를 통해 관찰자를 연결하고, 이 관찰자는 viewLifecycleOwner(여기서는 GameFragment)가 활성화된 상태에서 데이터 변경이 있다면 이를 뷰에 업데이트 해주는 것이다. 


3. DataBinding 이란?

위에서 작성된 예시를 보면 binding.wordCount.text와 같은 형태로 GameFragment에서 뷰에 접근해서 이를 조작했다. 이를 ViewBinding이라고 한다. 코드에서 뷰에 접근하는 형태이며, 뷰에서는 코드에 접근할 수 없다는 한계가 잇다.

DataBinding은 뷰와 코드를 결합함으로써 UI 변경사항들을 코드로 작성할 필요가 없어지기 때문에 변경사항이 생겼을 때 수정이 더 용이하다는 장점이 있다.

-> 이전에는 UI Controller에서 변경사항을 적용해주었다면, DataBinding은 이를 레이아웃 파일에서 적용해주며 ViewModel에만 집중하면 된다. 라는 생각을 했다. 

<!--game_fragment.xml-->
<data>
	<variable
    	name="gameViewModel"
        type="패키지명.뷰모델"/>
</data>
//GameFragment.kt
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        binding.gameViewModel = viewModel
        binding.lifecycleOwner = viewLifecycleOwner
}

레이아웃 파일과 View에서 위와 같이 작성하는데, lifecycleOwner를 설정해야 하는 이유는 레이아웃 파일에서 LiveData를 관찰하기 위해서 수명 주기에 대해서 알고 있어야 하기 때문이다.

 

4. 후기, 이후 계획

ViewBinding과 DataBinding을 구분 없이 비슷한 개념으로 이해하고 있었어서 지금까지 다른 사람들이 작성한 코드를 보며 'xml파일에 data태그로 묶인 것들은 그냥 작성하면 되나보다.'라고 생각하고 있었다. 이를 지금이라도 알 수 있어서 다행이라는 생각이 들었다. ViewModel에 대해 학습하고 LiveData에 대해 알아보는 시간을 가져서 왜 Mutable로 선언하면서 val로 선언하는지에 대해 더 수월하게 이해할 수 있었다. 

 

AAC(Android Architecture Components)에 대한 학습을 이어서 하고자 한다.

실습한 내용은 Github 링크를 통해 확인하실 수 있습니다.

 

참고 문헌

Use LiveData with ViewModel (android.com)

LiveData overview  |  Android Developers