[Android] LiveData

2 분 소요

👩지난 시간 알아본 ViewModel과 짝꿍처럼 자주 함께 쓰이는 LiveData에 대해 알아보고자 한다. LiveData에 대해 알아보기 전에 Observer에 대해 간단히 살펴보자!

🙋‍♀️Observer?

말 그대로 관찰자의 역할을 하는 녀석이다.

데이터가 변경되는지 감시하며, 변경될 경우 UI 컨트롤러에게 알려준다. 알람을 받은 UI 컨트롤러는 해당 데이터로 UI를 업데이트하게 된다.

🙄여기서 Observer가 감시할 수 있는 데이터가 바로 LiveData라는 데이터 홀더 클래스가 가지고 있는 데이터에 해당한다.


🙋‍♀️LiveData?

공식문서에 나와있는 LiveData에 관한 내용이다.

LiveData는 관찰 가능한 데이터 홀더 클래스입니다. 관찰 가능한 일반 클래스와 달리 LiveData는 수명 주기를 인식합니다. 즉, 액티비티, 프래그먼트, 서비스 등 다른 앱 구성요소의 수명 주기를 고려합니다. 수명 주기 인식을 통해 LiveData는 활동 수명 주기 상태에 있는 앱 구성요소 관찰자만 업데이트합니다.

그렇다면 LiveData의 사용법을 알아보자!


🙋‍♀️ViewModel & LiveData

아래 변수 text의 변경을 감시하고자 한다 가정하자.

     private val _text = MutableLiveData<String>().apply {
        value = "This is home Fragment"
    }
  • ViewModel 안에 MutableLiveData객체로 변수 text를 생성한다.

  • <>안에 해당 변수가 어떤 형태인지를 명시해준다.

  • 위 방식이 아닌 _text.value를 통해서 값을 넣을 수도 있다.

👩 여기까지 진행한다면 Observer에서 감시할 수 있는 데이터 _text가 만들어진 것이다.


🙄왜 MutableLiveData?

LiveData가 아닌 왜 MutableLiveData 객체로 선언을 해야 할까??

MutableLiveData는 LiveData를 상속받은 클래스로 postValue, setValue 메소드가 추가된 클래스이다. 즉, LiveData가 아닌 Mutabledata 객체로 생성을 해야 값을 수정할 수 있게 된다.

MVVM 패턴을 사용할 경우, 값 변경이 전달되는 과정을 그림을 통해 살펴봐보자.

  • 1-2-3 과정을 거쳐 Observer가 값의 변경 사실을 알게된다.
  • 즉, Observer는 LiveData를 관찰하게 되고, 이러한 LiveData는 MutableLiveData와 연결되어 있다.
    • 2의 과정을 거치는 이유는 UI 컨트롤러에서 값을 직접 수정하지 못하게 하기 위함이다.


🙋‍♀️LiveData의 장점

  • UI와 데이터 상태의 일치 보장
    • LiveData가 변경될 때마다 Observer 객체의 알람으로 UI가 업데이트 되기 때문이다.
  • 메모리 누수 없음
    • Observer는 UI 컨트롤러의 수명 주기를 따르므로 UI 컨트롤러의 수명주기가 끝나면 자동으로 삭제된다.
  • 중지된 활동으로 인한 비정상 종료 없음
    • 활동이 백스택에 있을 때를 비롯하여 관찰자의 수명 주기가 비활성 상태에 있으면 관찰자는 어떤 LiveData 이벤트도 받지 않는다.
  • 수명 주기를 더 이상 수동으로 처리하지 않음
    • UI 구성요소는 관련 데이터를 관찰하기만 할 뿐 관찰을 중지하거나 다시 시작하지 않는다. LiveData는 관찰하는 동안 관련 수명 주기 상태의 변경을 인식하므로 이 모든 것을 자동으로 관리한다.
  • 최신 데이터 유지
    • 수명 주기가 비활성화되면 다시 활성화될 때 최신 데이터를 수신한다.
  • 적절한 구성 변경
    • 기기 회전과 같은 구성 변경으로 인해 활동 또는 프래그먼트가 다시 생성되면 사용 가능한 최신 데이터를 즉시 받게 된다.
  • 리소스 공유
    • LiveData 객체가 시스템 서비스에 한 번 연결되면 리소스가 필요한 모든 관찰자가 LiveData 객체를 볼 수 있다.


🙋‍♀️LiveData 사용하기

☝️구성요소 추가: gradle

implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"


✌ LiveData 객체 생성

class HomeViewModel : ViewModel() {

    # MutableLiveData 객체 생성
    private val _text = MutableLiveData<String>().apply {
        value = "This is home Fragment"
    }

    # LiveData와 MutableLiveData 연결
    val text: LiveData<String> = _text
}
  • 보통 MutableLiveData의 변수명 앞에는 _를 붙이고 LiveData에는 붙이지 않는다.


👌Observer 객체 생성

class HomeFragment : Fragment() {

    private lateinit var homeViewModel: HomeViewModel
    ...

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {

        ...

        val textView: TextView = binding.textHome
        # ⭐Observer 생성해 LiveData와 연결!
        homeViewModel.text.observe(viewLifecycleOwner, Observer {
            # 데이터 변경 시마다 실행할 작업
            textView.text = it
        })
        return root
    }

  ...
  
}

🙄viewLifecycleOwner?

LifeCycleOwner로 Observer가 어떤 액티비티 혹은 프래그먼트의 수명주기를 따를지 정해준다.

  • 액티비티의 경우, 위 코드의 viewLifecycleOwner에 this를 작성해주면 된다.
    • 즉, Observer가 해당 액티비티에 의해 생성되고, 해당 액티비티의 수명주기를 따르겠다는 말이다.
  • 프래그먼트의 경우, viewLifecycleOwner를 사용하면 된다.


📃참고

  • [https://developer.android.com/topic/libraries/architecture/adding-components?hl=ko#lifecycle][https://developer.android.com/topic/libraries/architecture/adding-components?hl=ko#lifecycle]
  • [https://developer.android.com/topic/libraries/architecture/livedata?hl=ko][https://developer.android.com/topic/libraries/architecture/livedata?hl=ko]
  • [https://todaycode.tistory.com/49][https://todaycode.tistory.com/49]

댓글남기기