Android Data Binding Library #01
Data binding is a general technique that binds data sources from the provider and consumer together and synchronizes them.
데이터 바인딩은 공급자와 소비자의 데이터 원본을 함께 바인딩하고 동기화하는 일반적인 기술입니다.
안드로이드에서 데이터 바인딩을 하는 방법에 대해 알아보겠습니다.
데이터 바인딩에 대해 알아보기 전에 안드로이드의 UI에 대해 살펴보겠습니다.
기본적으로 안드로이드 UI는 Xml 레이아웃 코드와 이 레이아웃을 업데이트하기 위한 Java 코드로 구성되어 있습니다.
좀 더 자세히 살펴보면, 아래와 같이 UI를 구현합니다.
1. Xml 레이아웃 코드를 작성.
2. View를 인스턴스화 시킴. (findViewById, @BindView)
3. View에서 제공하는 API를 통해 View를 업데이트. (setText, setBackground etc..)
안드로이드 데이터 바인딩을 이용한 UI 구현법에 대해 살펴보겠습니다.
안드로이드에서는 서포트 라이브러리를 통해 지원되는 데이터 바인딩 라이브러리를 이용해야 합니다.
Support library : Android 2.1 (API 7)부터 지원
Android Plugin for Gradle : 1.5.0-alpha부터 지원
Android Studio : 1.3부터 지원
우선 데이터 객체-POJO(plain-old java object)가 있어야 합니다.
데이터 바인딩 POJO와 일반 POJO는 차이가 없습니다.
name과 type을 가지는 <data> 태그를 Xml 레이아웃 코드 상단에 추가합니다.
이때 type에는 데이터 객체를 작성합니다.
이를 통해 content라는 이름을 가지는 변수를 이 레이아웃에서 이용할 수 있습니다.
<data> 태그를 통해 선언한 content 변수를 "@{}" 구문을 이용해 View의 속성 값으로 넣을 수 있습니다.
바인딩 클래스는 레이아웃 파일의 이름을 기준으로 자동 생성됩니다.
파스칼 표기법(합성어의 첫 글자를 대문자로 표기)으로 변환하고 뒤에 "Binding" 접미사를 추가함.
ex) R.layout.activity_main -> ActivityMainBinding.class
<data class="CustomName"> // <data>의 class 특성을 이용해 이름을 지정할 수 있습니다.
...
</data>
아래와 같이 바인딩 클래스를 정의하고, <data> 태그를 통해 선언한 레이아웃 변수를 직접 설정해 줘야 합니다.
바인딩 클래스를 정의하는 Activity, Fragment나 Adapter는 public 접근 권한으로 선언해야 합니다.
위에서 설명한 여러 절차를 통해 바인딩 클래스를 설정해 주면, POJO의 값들을 View에 이용할 수 있었습니다.
하지만 이후에 POJO를 수정하더라도 View에 반영되지 않기 때문에 UI가 업데이트되지 않습니다.
이를 해결하기 위해 데이터가 변경될 때마다 알려주는 메커니즘들을 데이터 바인딩에서 이용할 수 있습니다.
Observable Object, Observable Field, Observable Collection이 세 가지 데이터 변경 알림 메커니즘들에 대해 알아보겠습니다.
안드로이드 데이터 바인딩에서 제공하는 Observable 인터페이스를 구현한 클래스를 이용하면 POJO를 Observable Object로 이용할 수 있습니다.
직접 개발할 수도 있지만, Observable 인터페이스를 구현한 BaseObservable 클래스를 이용하면 더 쉽게 개발할 수 있습니다.
getter에는 @Bindable 주석을 할당하고 setter에는 notifyPropertyChanged(int fieldId)를 통해 속성 변경을 알릴 수 있습니다.
Observable 인터페이스를 이용한 POJO가 아닌, ObservableField를 이용할 수 도 있습니다.
이 외에도 Java 변수의 기본형들을 이용하는 ObservableBoolean, ObservableByte, ObservableChar, ObservableShort, ObservableLong, ObservableFloat, ObservableDouble, ObservableParcelable가 있습니다.
Key와 Value로 이루어진 Map형태의 동적인 구조체도 ObservableArrayMap으로 제공하고 있습니다.
List 형태인 ObservableArrayList도 제공하고 있습니다.
단순히 Data를 기반으로 View를 업데이트하는 데이터 바인딩은 기존 코드에 비해 아래와 같은 공수가 필요합니다.
데이터 바인딩이 앱 성능면에서 장점이 있기보다는, Java에서 했던 일들을 Xml에서 처리하기 때문에 Java 코드가 좀 더 단순해지는 장점이 있습니다.
반대로 Xml 코드가 더 많아지고, 코드 분석을 위해 Xml도 파악해야 한다는 단점도 있습니다.
가장 기본적인 안드로이드 데이터 바인딩 기능만 이용한다면, 굳이 기존의 익숙한 코드들을 두고 바꿀 필요는 아직 못 느끼겠네요.
다음 글에서는 이벤트들에 대해 작성하겠습니다.