[Android Jetpack] LiveData를 알아보자!

JJAE WON·2021년 9월 9일
0

Android JetPack

목록 보기
2/3
post-thumbnail

이전 게시글에서 소개한 MVVM 아키텍처 패턴을 더 공부하기 위해선 ViewModel과 LiveData 에 대해 자세하게 알아야 한다.
이 포스팅에서는 LiveData에 대해 다루기로 하였다.
LiveData는 JetPack 라이브러리의 구성요소 중 하나이다.

Jetpack 은 개발자가 관심 있는 코드에 집중할 수 있도록 권장사항 준수, 상용구 코드 제거, 모든 Android 버전과 기기에서 일관되게 작동하는 코드 작성을 돕는 라이브러리 모음


LiveData란?

LiveData는 일반 클래스와 다르게 Lifecycle를 인식할 수 있는 클래스이다.
Activity와 Fragment의 LifeCycle을 인식하여 현재 활성화가 되어있는 관찰자만 업데이트하게 된다.
그렇기 때문에, LifeCycle이 종료되면 같이 사라지기 때문에 메모리 누출이 없는 장점이 있다.

또한, Observe 패턴 을 따르기 때문에 데이터가 변경될 때 활성화가 되어있는 관찰자가 UI를 업데이트 해주므로 개발자가 데이터를 업데이트할 필요가 없다


Observe Pattern

Observe Pattern은 데이터를 발행하는 발행자(Observable)데이터를 구독하는 구독자(Observe)로 나누어 진다.
그림에서는 왼쪽에 있는 Subject가 발행자이고, 오른쪽에 있는 얘들이 구독자이다.

만약 IT정보를 보내주는 메일 서비스를 구독하게 되면 IT정보가 업데이트 될 때마다 메일로 나에게 알려주게 될 것이다. 여기서 메일 서비스는 발행자가 될 것이고, 메일 서비스를 수신하는 나는 구독자가 될 것이다.

LiveData는 데이터를 발행시키는 발행자인 observable로 LiveData를 구독, 즉 Observe(관찰)하는 객체들에게 데이터를 실시간으로 제공한다.

LifecycleOwner

안드로이드에서는 아무에게나 LiveData를 업데이트 시켜주지 않는다. 위에서 말한 Activity와 Fragment의 LifeCycler에 따라 활성화되고, 종료된다.

🤔 그럼!! 어떻게 LiveData는 lifeCycle을 알 수 있을까?! -> 바로 LifecycleOwner 인터페이스때문에 가능하다.
LifecycleOwner 인터페이스는 Activity나 Fragment의 LifeCycle을 알고 있고 그거를 알려준다.


  • LifeCycler에 따른 LiveData 상태
  1. STARTED or RESUME -> 관찰자 활성
  2. DESTROYED -> 관찰자 삭제


LiveData 객체 사용하기

숫자를 입력하고, 더하기 또는 빼기 버튼을 눌렀을 때 값이 더해지거나 빼지는 앱이 있다고 가정하자.

1. LiveData 객체 만들기

LiveData는 Collections 에 있는 모든 데이터와 함께 사용할 수 있다.
일반적으로 ViewModel 객체 내에 저장된다.

  • MyViewModel

   private val _currentValue = MutableLiveData<Int>()
   val currentValue : LiveData<Int>
   	   get() = _currentValue

클래스 내부에서 변경되는 데이터를 가지고 있는 MutableLiveData
클래스 외부에서 읽기 전용으로 사용되는 LiveData를 만들어 준다.


2. LiveData에 Oberver 객체 연결

LivaData 객체 관찰을 시작하기에 적합한 메서드는 onCreate()이다. Observe 객체는 대부분 Activity나 Fragment와 같은 UI 컨트롤러에 일반적으로 존재한다.

  • MainActivity
        myViewModel.currentValue.observe(this, Observer {
        // it : LiveData의 Value 값
            Log.d("로그"," currentLiveData value change : $it")
            tvNumber.text = it.toString()
        })

observe() 메서드의 첫번째 매개변수는 LifeCycleOwner인 MainActivity이다.
두번째 매개변수는 Observe는 LiveData의 value 변경을 감지하는 부분이다.


3. 이벤트 발생시 LiveData 객체 업데이트

  • MyViewModel
   fun updateValue(actionType: ActionType, input : Int){
        when(actionType){
            ActionType.PLUS ->
                _currentValue.value = _currentValue.value?.plus(input)
            ActionType.MINUS ->
                _currentValue.value = _currentValue.value?.minus(input)
        }
    }

ViewModel 내부에 이벤트가 발생했을때 호출될 메서드를 선언시킨다.
매개변수로는 더하기인지 마이너스인지 구분할 type과 더하고자 하는 값을 전달받는다.


  • MainActivity
   btnPlus.setOnClickListener {
    myViewModel.updateValue(ActionType.PLUS, userInput)
}

UI 컨트롤러에서 바로 LiveData 객체의 값을 업데이트 하기 위해선 setValue 또는 postValue도 사용할 수 있다.
버튼을 눌렀을 때 MyViewModel의 updateValue를 호출시켜 LiveData를 업데이트 시킨다.

이벤트가 발생하면, 활성화 상태인 관찰자들이 모두 보고있는 LiveData 값이 업데이트된다.



마무리

LiveData는 RoomDataBase,코루틴,ViewModel 등등과 함께 사용되며, 여러 LiveData를 병합할 수도 있고 확장, 변환도 가능하다.
다음에는 LiveData가 구현되는 ViewModel에 대해서 알아 볼 것이다.


참조
profile
안드왕 찐천재가 되고싶다.

1개의 댓글

comment-user-thumbnail
2022년 8월 3일

자료 잘봤어요! 지금은 졸업하고 취준중이신가여?

답글 달기