[Android] Jetpack 컴포넌트 : LiveData

mingsso·2023년 3월 27일

Android

목록 보기
8/12

1️⃣ LiveData란

데이터의 변경을 관찰할 수 있는 Data Holder 클래스

액티비티, 프레그먼트, 서비스 등과 같은 안드로이드 컴포넌트의 생명주기를 알고 있으며, 컴포넌트가 활성 상태(STARTED나 RESUMED)일 경우에만 데이터를 업데이트 함

또한 LiveData 객체는 Observer 객체와 함께 사용됨
즉, LiveData가 가지고 있는 데이터에 어떠한 변화가 일어날 경우, LiveData는 등록된 Observer 객체에 변화를 알려주고, Observer의 onChanged()가 실행되게 됨

LiveData 사용의 이점

  • UI와 데이터 상태의 일치 보장
    • ViewModel을 통해 UI 관련 데이터를 관리해주고 View에 데이터를 그려줄 수 있지만, 한 번 그려진 View는 데이터가 변화했다고 다시 그려주지는 않는다. 그렇다고 해서 Activity나 Fragment를 다시 그리기에는 불필요한 비용이 든다
    • 하지만 LiveData는 Observer 패턴을 사용하여 자동으로 데이터가 업데이트 되기 때문에 추가적인 코드 없이 UI는 항상 최신화된 데이터 상태를 가질 수 있다
  • 메모리 누수 없음
    • 해당 컴포넌트의 생명주기가 DESTROY 상태가 될 경우 자동으로 삭제된다
  • 리소스 공유
    • LiveData 객체가 시스템 서비스에 한 번 연결되면 리소스가 필요한 모든 관찰자가 LiveData 객체를 볼 수 있다



2️⃣ LiveData 객체 사용법

  1. LiveData 객체 생성하기
    LiveData는 Collections를 구현하는 List와 같은 객체를 비롯하여 모든 데이터와 함께 사용할 수 있는 래퍼임
    일반적으로 ViewModel 객체 내에 정의됨
  // Repository를 사용할 경우 
  val ticketList : LiveData<List<TicketResponse>> = repository.getName()
  
  
  // Repository를 사용하지 않을 경우 
  private var _ticketList = MutableLiveData<List<TicketResponse>>()
  val ticketList: LiveData<List<TicketResponse>> 
  		get() = _ticketList

  1. onChanged() 메서드를 정의하는 Observer 객체를 만듦
    일반적으로 액티비티나 프래그먼트 같은 UI 컨트롤러에 Observer 객체를 만듦
  val ticketListObserver = Observer<List<TicketResponse>> {
		fragmentTicketListRv.replaceAll(it)
  }

  1. observe() 메서드를 사용하여 LiveData 객체에 Observer 객체를 연결함
    Observer 객체가 LiveData 객체를 구독하여 변경사항에 대한 알림을 받게 됨
    일반적으로 액티비티나 프래그먼트 같은 UI 컨트롤러에 Observer 객체를 만듦
  mainVm.tickerList.observe(this@MainFragment, tickerListObserver)

+)
안드로이드 스튜디오 버전 3.1 이상부터는 Observable 필드의 사용 대신 LiveData를 데이터바인딩 코드에서 사용하는 것을 권장하고 있음

private val sharedViewModel: SurveyViewModel by activityViewModels()

override fun onCreateView(
	inflater: LayoutInflater, container: ViewGroup?,
	savedInstanceState: Bundle?
): View? {
	val fragmentBinding = RouletteBinding.inflate(inflater, container, false)
	binding = fragmentBinding

	binding.roulette.apply {
		rouletteSize = rouletteData.size
		setRouletteDataList(rouletteData)
	}

	sharedViewModel.picked.observe(viewLifecycleOwner) {
		binding.roulette.rouletteSize = it.size
		binding.roulette.setRouletteDataList(it)
	}
}

LiveData는 observe()를 사용해 Observer 객체와 결합함
첫 파라미터에 viewLifeCycleOwner를 전달해서, 프래그먼트의 뷰가 살아있는 동안에만 데이터의 변경을 관찰할 수 있도록 해줌 (onCreateView ~ onDestroyView 사이에만)



3️⃣ LiveData 동작과정

MVVM 아키텍처에서 Repository를 사용하는 경우,

  1. Repository의 MutableLiveData 값이 변경됨 (MutableLiveData와 LiveData는 연결되어 있음)
    • Repository를 사용하지 않는다면, ViewModel에서 MutableLiveData를 생성해서 LiveData와 연결함
  1. Observer는 LiveData가 변경되는지 감시하고 있다가 Activity에게 알려줌 -> 변경사항을 들은 액티비티는 UI를 업데이트 함

-> 액티비티가 값을 직접 수정하지 못하도록, Observer-LiveData-MutableLiveData 구조를 사용함

LiveData는 데이터 읽기만 가능하므로, 데이터를 쓰려면 MutableLiveData를 사용해야 함
즉, LiveData는 public으로 MutableLiveData는 private으로 선언해서 외부에서는 관찰을, 내부에서는 수정을 하는 방식이 되어야 함




참고자료

아키텍처를 알아야 앱 개발이 보인다, 옥수환 저
https://ardor-dev.tistory.com/78
https://developer.android.com/topic/libraries/architecture/livedata?hl=ko
https://velog.io/@jojo_devstory/Android-LiveData...%EB%84%8C-%EB%88%84%EA%B5%AC%EB%83%90
https://developer.android.com/codelabs/basic-android-kotlin-training-livedata?hl=ko#3
https://comoi.io/300

profile
🐥👩‍💻💰

0개의 댓글