[Android/Kotlin] ViewModel + LiveData + ViewBinding 예제
안녕하세요 골드입니다.
ViewModel + LiveData + View Binding은 현시점 구글에서 권장하는 애플리케이션 개발 방법입니다. 먼저 Binding은 findViewById를 대체할 수 있다는 장점을 가지고 있습니다. 두 번째로 ViewModel은 앱의 생명주기에 대한 처리(예를 들어 화면 전환)를 따로 하지 않아도 데이터가 유지된다는 장점이 있고, LiveData를 함께 사용하여 값이 변했을 때, 이를 관찰하고 있는 UI 역시 데이터가 업데이트된다는 장점이 있습니다. 오늘은 간단하게 이 셋을 함께 사용하는 예제를 만들어 보겠습니다.
먼저 MainActivity와 Blank Fragment를 하나 만들겠습니다.
1. View Binding 뷰 결합
먼저 View Binding을 사용하도록 app bundle android 블록 안에 코드를 적습니다. Fragment에서 Binding 클래스를 생성하기 위해 data binding 역시 사용합니다.
뷰 결합을 사용하겠다고 코드를 적고 나면 xml에서 사용할 수 있습니다. xml 파일 안에 코드를 <layout> 태그 안에 작성합니다. TextView에 id값을 text_view로 주겠습니다.
View들을 <layout> 태그 안에 작성하였다면, 안드로이드 스튜디오가 자동으로 Binding Class를 생성합니다. Binding 클래스는 xml 뷰들을 자동으로 초기화하여 접근할 수 있도록 도와줍니다. xml 파일을 Kotlin(혹은 Java) 코드로 접근하여 사용할 수 있다는 뜻입니다. Binding 클래스는 Fragment와 앞에 접두사를 반대로 갖고 뒤에 Binding이 붙는 이름을 갖습니다. 예를 들어 Fragment 이름이 TestFragment.kt 라면 FragmentTestBinding이라는 이름을 갖는 Binding class가 생성됩니다.
Binding 클래스를 lateinit으로 선언하였습니다. 그 이유는 Fragment가 먼저 생성되어야 하기 때문입니다. 그리고 onCreateView에서 binding 변수를 초기화합니다. xml에 작성한 TextView id를 text_view로 선언하였습니다. 이 TextView는 Binding class 안에 textView로 선언됩니다. id값을 스네이크 케이스로 작성하면 _ 뒤에 단어가 자동으로 대문자로 변환됩니다.
TextView를 Kotlin 코드 binding.textView로 접근할 수 있게 되었고 onCreateView에 리턴 값으로 Binding 클래스에 root를 리턴하여 Binding을 완성합니다. Binding의 root는 .xml과 같은 말이라고 할 수 있겠습니다.
2. ViewModel + LiveData
먼저 ViewModel을 Fragment 안에서 초기화하기 위해서 필요한 의존성을 추가합니다. 잘은 모르겠지만 Fragment에서 ViewModel을 초기화하기 위해 도움을 주는 코드가 fragment-ktx 의존성 안에 있습니다.
다음은 ViewModel Class를 만듭니다. 기본적으로 ViewModel은 ViewModel 클래스를 상속받습니다. ViewModel은 UI에 표시하기 위한 데이터를 저장하는 용도로 사용합니다. ViewModel 클래스를 생성하고 그 안에 LiveData 변수를 하나 선업합니다.
LiveData는 예를 들어 List와 같은 래퍼 클래스입니다. something이라는 String 변수를 LiveData의 형태로 선언하였고 getter를 통해 접근이 가능합니다. 처음에는 객체의 데이터가 설정되지 않습니다.
TestFragment에 전체 코드입니다. 간단하게 TextView 하나만 넣으면 ViewModel에 있는 something 변수를 관찰하고 있는지 확인할 수 없기 때문에 밑에 버튼을 누르면 something의 값을 변경하는 코드를 추가하였습니다. 확인해보겠습니다.
버튼을 누르면 데이터가 바뀌고 관찰하고 있던 TextView UI까지 바뀌는 것을 확인할 수 있습니다.
여기까지 골드였습니다.
감사합니다.
참고자료 : 뷰 결합 | Android 개발자 | Android Developers
LiveData 개요 | Android 개발자 | Android Developers