본문 바로가기
Jetpack Library

[Android JetPack] LiveData 기본

by JongSeok 2023. 1. 4.

Android JetPack 라이브러리 중 하나인 LiveData에 대해 알아보겠습니다.

특히, LiveData는 ViewModel과 DataBinding과 함께 유용하게 사용됩니다.

 

[안드로이드] ViewModel 이란? ( + ViewModelFactory)

이번에 알아볼 ViewModel은 이전 포스팅에서 공부했던 MVVM 디자인 패턴의 구성요소 중 하나인 ViewModel입니다. 이해를 돕기 위해 예제와 함께 작성하겠습니다. 이전 포스팅 [안드로이드] MVVM 디자인

develop-oj.tistory.com


LiveData

LiveData는 관찰(observe) 가능한 데이터 홀더 클래스입니다. 스스로 수명 주기(LifeCycle)를 인식합니다.

LiveData의 장점

  • UI와 데이터 상태의 일치 보장
  • 메모리 누수 없음
  • 비정상 종료 없음
  • 수명 주기를 자동으로 처리
  • 최신 데이터 유지
  • 기기 회전, Activity / Fragment 재생성시에도 최신 데이터 즉시 반영
  • 리소스 공유

Android Developers 공식 문서를 참고했습니다.


LiveData 실행 예시

먼저 app수준 build.gradle에 종속성을 추가합니다. ViewModel을 사용하지 않을 경우 맨 마지막 줄의 종속성만 추가하셔도 무방합니다.

    // by viewModels()를 이용하기 위한 종속성
    implementation 'androidx.activity:activity-ktx:1.4.0'
    implementation 'androidx.fragment:fragment-ktx:1.4.1'
    // ViewModel
    implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1'
    // Livedata
    implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.5.1'

저는 LiveData 객체를 ViewModel에서 생성하기 위해 ViewModel 클래스를 만들어 주도록 하겠습니다.

 

MainViewModel

class MainViewModel(count : Int, ) : ViewModel() {
    val liveData : MutableLiveData<Int> = MutableLiveData(count)
}

LiveData는 추상 클래스이기 때문에 LiveData 클래스를 상속받는 MutableLiveData 클래스로 생성해 줍니다.

 

MainActivity

class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding
    private val viewModel: MainViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        // viewModel의 liveData 값 관찰
        viewModel.liveData.observe(this) {
            binding.numberOutput.text = it.toString()
        }
        // 증가 버튼 클릭
        binding.plusButton.setOnClickListener {
            viewModel.liveData.value = viewModel.liveData.value?.plus(1)
        }
        // 감소 버튼 클릭
        binding.minusButton.setOnClickListener {
            viewModel.liveData.value = viewModel.liveData.value?.minus(1)
        }
    }
}

observe에서 첫 번째 매개변수인 this는 LifeCycleOwner인 MainActivity입니다.

관찰하고 있는 동안 LiveData의 value 값의 변화가 감지되면 두 번째 매개변수인 중괄호 내부가 실행됩니다.

위 코드에서는 증가 / 감소 버튼을 클릭 시 viewModel.liveData의 value 값에 1을 더하거나 빼도록 코드를 작성했습니다.

viewModel.liveData.value의 값의 변경이 감지되면 자동으로 UI(numberOutput)가 갱신되는 것을 볼 수 있습니다.

 

간단한 예제를 통해 LiveData에 대해 공부해 보았습니다.

다음 포스팅에서는 공부한 내용을 바탕으로 DataBinding에 대해 알아보겠습니다 :)

728x90
반응형