업데이트:

카테고리:

/

태그: , , , ,

구성 변경이 일어날 때 데이터는 저장되지 않는다.

Activity가 재생성되기에 LifeCycle도 onDestory → onCreate 가 호출된다.

앱 아키텍쳐

  • UI Controlloer

    Activity, Fragment와 같은 UI 기반의 클래스

    시스템 상호작용과 같은 로직만 있어야한다.

    ex) 유저가 화면을 누를때 알림, 요소 그리기…

  • ViewModel

    Activity, Fragment에 연관된 데이터

    UI 클래스와 동일한 생명주기를 가지고 있다. 단, 구성변경과 같은 reCreate가 발생할 때에는 viewModel에 저장되어 있는 데이터가 유지된다.

    간단한 계산이나 변환은 괜찮다.

    • ViewModelFactory

      viewModel에 의존성이 필요할 때 Factory를 사용하여 의존성을 처리한다.

    • ViewModelProvider

      없으면 ViewModel 객체를 생성하고 있으면 생성된 ViewModel 객체를 반환한다.

LiveData

수명주기를 인식하는 관찰가능한 데이터 홀더 클래스 → 따로 변경에 따른 로직을 작성할 필요가 없다

  • 관찰가능함: LiveData에서 변화가 생겼을 떄 observer를 통해 알림을 보낼 수 있다.
  • 수명주기 인식: LifeCyclerOwner와 관찰자가 연관되어 있고 수명주기가 STARTED, RESUMED 일 때만 데이터가 변경된다.

관찰자 연결

observer 를 세팅할 때 LifeCyclerOwner를 설정한다.

그 이유는 Fragment나 Activity로 이동하는 과정에서 관찰자가 소실되면 업데이트 하는 과정에서 오류가 발생할 수 있기에 각 observer마다 관찰자를 세팅해야된다.

viewModel.varible.observer(viewLifeCycleOwner, Observer { newVar -> 
	binding.old.text = newVar
})

viewModel에 정의된 변수에 변화가 생기면 observer 내부에 있는 로직이 실행된다.

캡슐화

다루는 데이터가 많으면 UI Controller에서 변경이 발생할 수 있다.

그래서 viewModel 내부에서만 변경이 일어나도록 하고, UI Controller에서 사용하는 값은 읽기 전용인 변수 타입으로 건네줘야한다.

  • MutableLiveData : 수정이 가능, ViewModel 내에 있다.
  • LiveData : 수정이 불가, ViewModel 외부에 존재하며, LiveData의 형태로 사용된다.

Backing Property

프로퍼티 = 필드 + 게터 + 세터

val - Getter / var - Getter, Setter

// 명시적으로 getter, setter를 설정할 수 있다.
val name = "KIM"
get() {
	return field
}

이것을 ViewModel 내부에 적용해보면

private val _score = MutableLiveData(0)
val score: LiveData<Int> = _score 

변경 가능한 MutableLiveData는 private 로 ViewModel 내부에서만 접근이 가능하고 외부에서는 읽기 전용 값인 LiveData 만 접근할 수 있다.

DataBinding

xml 파일과 ViewModel의 데이터가 직접 소통

타입 보호 + 뷰 객체에 데이터를 직접적으로 보여줄 수 있다.

  1. build:gradle(Moudle:app) 에 buildFeature { dataBinding true } 설정
  2. dataBinding을 사용할 xml 파일에 data 연결

     <layout>
     	<data>
     		// 사용할 ViewModel과 xml에서 사용할 변수명을 적는다.
     		<varible name="" data="">
     	</data>
     </layout>
    
  3. xml 에 @{example.onClick} 와 같은 형식으로 데이터를 연결한다.
  4. Activity, Fragment에서 binding.lifecycleOwner = ViewlifecycleOwner 로 설정