LiveData

장범준·2023년 5월 7일
0

※지극히 저의 언어로 해석해서 이해한 내용입니다.※

오늘은 LiveData에 대해 알아 보겠습니다!

그게 뭔가요?

LiveData는 관찰 가능한 Data Holder 클래스입니다.

Data Holder란 Data(값)을 Holder(보관하는 통)으로, 특정 값이 손실되지 않기 위해 보관해주는 것을 뜻합니다. ViewModel을 떠올리면 좋음

일반적인 Observable과는 다르게 LiveData는 LifeCycle을 알고 있습니다. 또한 Observer 객체를 함께 사용합니다.

Observable는 관찰자를 뜻함. 예를 들어 버튼을 눌렀을 때 값이 변하려면, 누군가는 버튼을 누르는지 관찰해야겠죠. 그런걸하는 앱니다.

이걸로 알수있는 점은, LiveData를 액티비티나, 프레그먼트 등의 LifeCycle에 맞게 값에 변화를 줄 수 있다는 것입니다(STARTED 또는 RESUMED (화면을 (재)구성하는 순간). 그게 아니여도 Observer 객체를 함께 사용하기 때문에, 가지고 있는 값에 변화가 감지되면 Observer 객체에 변화를 알려주고, Observer의 onChanged() 메소드가 실행하게 됩니다.

여기서 드는 궁금증. LiveData는 생명주기를 어떻게 아는가?
LifeCycleOwner라는 녀석이 생명주기를 알고 있는 클래스인데, Activity나 Fragment를 변수로써 사용(getLifeCycle() 함수를 통해)한다면 각 화면 별 생명주기에 따라 LiveData는 자신의 임무를 수행 합니다.LifeCycleOwner 인터페이스 클래스이기 때문에 상속 받아야 됩니다.

왜 쓰나요?

Data와 UI간 일치

LiveData는 Observer 패턴을 따릅니다. 그에따라 LiveData는 안드로이드 생명주기에 데이터 변경이 일어날 때마다 Observer 객체에 알려줍니다.
그리고 이 Observer 객체를 사용하면 데이터의 변화가 일어나는 곳마다 매번 UI를 업데이트하는 코드를 작성할 필요 없이 통합적이고 확실하게 데이터의 상태와 UI를 일치시킬 수 있습니다.

메모리 누수 없음

관찰자는 Lifecycle 객체에 결합되어 있으며 연결된 수명 주기가 끝나면 자동으로 삭제됩니다.(DESTROYED로 변경될 때)

중지된 활동으로 인한 비정상 종료 없음

활동이 백그라운드에 있을 때를 비롯하여 관찰자의 수명 주기가 비활성 상태에 있으면 관찰자는 어떤 LiveData 이벤트도 받지 않습니다.

최신 데이터 유지

수명 주기가 비활성화되면 다시 활성화될 때 최신 데이터를 수신합니다. 예를 들어 백그라운드에 있었던 활동은 포그라운드로 돌아온 직후 최신 데이터를 받습니다.

리소스 공유

앱에서 시스템 서비스를 공유할 수 있도록 싱글톤 패턴(하나 만들면 계속 그것을 사용함)을 사용하는 LiveData 객체를 확장하여 시스템 서비스를 래핑할 수 있습니다. LiveData 객체가 시스템 서비스에 한 번 연결되면 리소스가 필요한 모든 관찰자가 LiveData 객체를 볼 수 있습니다.

어떻게 사용하나요?

1. 특정 유형의 데이터를 보유할 LiveData의 인스턴스를 생성합니다. 이 작업은 일반적으로 ViewModel 클래스 내에서 이루어집니다.

class NameViewModel : ViewModel() {
    val currentName: MutableLiveData<원하는 자료형> by lazy {
        MutableLiveData<원하는 자료형>()
    }
    
}

2. onChanged() 메서드를 정의하는 Observer 객체를 만듭니다. 일반적으로 활동이나 프래그먼트 같은 UI 컨트롤러에 Observer 객체를 만듭니다.

class NameActivity : AppCompatActivity() {
    private val model: NameViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val nameObserver = Observer<원하는 자료형> { newName ->
            nameTextView.text = newName
        }
        
        model.currentName.observe(this, nameObserver)
        //nameObserver를 매개변수로 전달하여 observe()를 호출하면 onChanged()가 즉시 
        호출되어 mCurrentName(2번째 칸)에 저장된 최신 값을 제공합니다.
    }
}

3. observe() 메서드를 사용하여 LiveData 객체에 Observer 객체를 연결합니다. 이렇게 하면 Observer 객체가 LiveData 객체를 구독하여 변경사항에 관한 알림을 받습니다. 일반적으로 Activity이나 Fragment같은 UI 컨트롤러에 Observer 객체를 연결합니다.

public interface LifecycleOwner {
    @NonNull
    Lifecycle getLifecycle();
}
ViewModel.getAll().observe(viewLifecycleOwner) { foods ->
    adapter.submitList(foods)
}

좋기만 하나요?(한계)

1. 비동기 데이터 스트림을 처리하기에 적합하지 않다.

LiveData의 관찰은 오직 Main Thread에서만 진행되기 때문에 Android 클린 아키텍처의 Data Layer에서 LiveData를 사용해서 데이터 스트림을 처리하려고 하면 한계가 생깁니다.

2. Domain Layer에 사용하기 적합하지 않다.

일반적으로 Android 클린 아키텍처의 Domain Layer는 의존성을 가지지 않는 순수한 Kotlin/Java로 되어있는 레이어입니다. 하지만 LiveData는 AAC 라이브러리(ViewModel이기 때문?)에 해당하는 모듈을 추가해주어야 하는 문제가 있습니다.

3. 오직 한번만 변경된 데이터를 관찰해야 할 경우 문제가 생길 수 있습니다.

기본적으로 LiveData는 변경된 데이터가 뷰의 재생성에 따라 여러 번 사용할 수 있기 때문에 한 번만 떠야 하는 경우 문제가 발생할 수 있습니다. 이를 해결하기 위해 SingleLiveData를 사용합니다.

결론

LiveData는 조미료입니다. 그냥 쓰기 보다는 Databinding, ViewModel, RoomDatabase, Reactive Programing(RxKotlin/Rxjava)등과 함께 쓸 경우 그 진가가 발휘되며, 개발자는 아주 편하게 코딩이 가능하기 때문에 UI 출력 데이터에 관한 실수 또한 줄여줍니다.

자료출처

https://velog.io/@jojo_devstory/Android-LiveData...%EB%84%8C-%EB%88%84%EA%B5%AC%EB%83%90
https://ardor-dev.tistory.com/78
https://developer.android.com/topic/libraries/architecture/livedata?hl=ko#the_advantages_of_using_livedata

profile
자신의 언어로 해석해, 자신의 것으로 만둘자.

0개의 댓글