본문 바로가기

Study/Android

DataBinding

자주 사용하는 AAC 이긴 하지만

남에게 설명할 수 없을 때, 완벽하게 이해하지 못한 것이라는 말을 생각하여 정리하게 되었다.

 

안드로이드에서 DataBinding 이란?

프로그래매틱 방식이 아니라 선언적 형식으로 레이아웃의 UI 구성요소를 앱의 데이터 소스와 결합할 수 있는 지원 라이브러리이다.

Android Jetpack 중 구성요소이기도 하다.

예전에는 ButterKnife 라이브러리가 있었지만 어느 순간 사라지고 Databinding만 남았다.

(그리고 난 괜히 소스 라인만 많아지는 것 같아서 ButterKnife 쓰기가 너무 싫었다.) 

 

아래 링크를 보면 너무나도 설명을 잘 해주고 있다.

https://developer.android.com/topic/libraries/data-binding

 

데이터 결합 라이브러리  |  Android 개발자  |  Android Developers

데이터 결합 라이브러리 Android Jetpack의 구성요소. 데이터 결합 라이브러리는 프로그래매틱 방식이 아니라 선언적 형식으로 레이아웃의 UI 구성요소를 앱의 데이터 소스와 결합할 수 있는 지원

developer.android.com

 

DataBinding 을 사용하는 이유?

데이터바인딩을 사용하게 되면 데이터와 UI 요소 결합을 위해 필요한 코드를 최소화할 수 있다.

이것 또한 장점과 단점이 있다.

장점

  • findViewId()를 호출하지 않아도 xml에 있는 view를 만들어준다
  • RecyclerView 각각의 item에 data를 넣어주는 작업도 진행된다
  • data가 바뀌어도 자동으로 view 변경이 가능하다
  • xml 소스만 봐도 view에 어떤 데이터가 들어가 있는 지 확인이 쉽다
  • 코드 가독성이 높아지고, 코드량이 줄어든다
  • MVP 패턴과 MVVM 패턴을 구현할 때 유용하게 사용할 수 있다

 

단점으로는 클래스 파일이 많아지고 빌드 속도가 느려질 수가 있다고 한다.

 

그럼에도 내가 사용하는 이유는 단점보다 장점이 더 많고

빌드 속도가 느려진다 하더라도 크게 큰 차이를 못 느꼈었다.

그리고 무엇보다 findViewId()를 안 써도 된다는 게 정말 다행스럽다.

물론 findViewId()가 나쁜 것은 아니지만 1개의 데이터 모델을 갖고 findViewId()로 일일이 xml의 있는 view에 데이터 작업을 하게 될 때 이게 정말 노가다라는 생각을 했다.

그리고 Android Jetpack 에도 들어가서 따로 라이브러리를 implemetation 해 줄 필요가 없다.

 

 

DataBinding 사용하는 방법

1. app/build.gradle 추가

android {
	...
    dataBinding {
        enabled = true
    }
}

또는

android {
	...
    buildFeatures {
        dataBinding = true
    }
}

 

 

2. layout 추가

DataBinding 을 사용하는 xml 리소스는 <layout></layout> 태그부터 시작해야 한다.

 

activity_test.xml

<?xml version="1.0" encoding="UTF-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
	xmlns:app="http://schemas.android.com/apk/res-auto">

	<data>
	</data>
	
	<androidx.constraintlayout.widget.ConstraintLayout
		android:layout_width="match_parent"
		android:layout_height="match_parent"
		android:gravity="center_horizontal"
		android:background="@color/black"
		android:orientation="vertical">
		
		<TextView
			android:layout_width="match_parent"
			android:layout_height="wrap_content"
			android:text="title"
			app:layout_constraintTop_toTopOf="parent"
			app:layout_constraintStart_toStartOf="parent"
			app:layout_constraintEnd_toEndOf="parent"
			/>

		<TextView
			android:layout_width="match_parent"
			android:layout_height="wrap_content"
			android:text=""
			app:layout_constraintTop_toTopOf="parent"
			app:layout_constraintStart_toStartOf="parent"
			app:layout_constraintEnd_toEndOf="parent"
			/>
	</androidx.constraintlayout.widget.ConstraintLayout>
</layout>

 

 

3. Activity 수정

TestActivity.kt

class TestActivity : AppCompatActivity() {

    private lateinit var bind: ActivityTestBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        bind = DataBindingUtil.setContentView(this, R.layout.activity_test)

    }
}

여기서 ActivityTestBinding 은 activity_test.xml 의 binding class 로 <layout></layout> 태그가 붙는 xml에 한해 자동으로 클래스가 생성된다.

클래스 이름은 xml 파일 이름에 Binding이 붙여져 binding class인걸 확실하게 인식시켜준다.

그리고 해당 Activity에서 binding class를 인식할 수 있도록 setContentView()를 DataBindingUtil.setContentView()로 수정시켜준다.

 

여기까지가 기본적인 설정이다.

data와 결합하는 방식은 위에 activity_test.xml과 같이

<layout> 태그 안에 있는 <data></data> 태그에 <variable>이라는 태그를 통해 선언하면 된다.

하나는 data class를 통해 선언하는 방식과 하나는 String 을 통해 선언하는 방식을 설명하겠다.

 

 

4. Data Class 선언

데이터 결합을 위해 테스트 데이터 클래스를 만들었다.

data class HiModel(
        val title: String,
        val content: String
)

 

 

5. Data 와 결합을 위해 xml 수정

<layout> 태그 안에 <data></data>를 선언하여 <variable> 으로 data class를 연결하였다.

<variable> 에서 name은 type을 쓸 수 있게 만들어주는 이름으로 간단하게 짓는 것이 좋다.

 

name="hi" 는 만들어둔 HiModel data class 를 가져온 것이다.

name="comment"는 String 타입으로 activity에서 선언해줄 수 있다.

xml 리소스 내에서 "@{}" 구문을 사용하여 각 데이터들을 선언해 주었다.

<?xml version="1.0" encoding="UTF-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
	xmlns:app="http://schemas.android.com/apk/res-auto">

	<data>
		<variable
			name="hi"
			type="com.example.HiModel" />
		
		<variable
			name="comment"
			type="String" />
	</data>

	<androidx.constraintlayout.widget.ConstraintLayout
		android:layout_width="match_parent"
		android:layout_height="match_parent">

		<TextView
			android:layout_width="match_parent"
			android:layout_height="wrap_content"
			android:text="@{hi.title}"
			app:layout_constraintTop_toTopOf="parent"
			app:layout_constraintStart_toStartOf="parent"
			app:layout_constraintEnd_toEndOf="parent"
			/>

		<TextView
			android:layout_width="match_parent"
			android:layout_height="wrap_content"
			android:text="@{comment}"
			app:layout_constraintTop_toTopOf="parent"
			app:layout_constraintStart_toStartOf="parent"
			app:layout_constraintEnd_toEndOf="parent"
			/>
	</androidx.constraintlayout.widget.ConstraintLayout>
</layout>

여기서 default 값도 설정할 수 있는데 아래와 같은 방법으로 하면 된다.

android:text="@{comment, default=TEXT}"

 

 

6. Data 와 결합을 위해 Activity 수정

class TestActivity : AppCompatActivity() {

    private lateinit var bind: ActivityTestBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        bind = DataBindingUtil.setContentView(this, R.layout.activity_test)
        
        val hiModel = HiModel("타이틀", "콘텐츠")
        bind.hi = hiModel
        bind.comment = "코멘트"

    }
}

실행하면 activity에서 넣은 값이 xml에 적용되어서 보여진다.

 

 

 

'Study > Android' 카테고리의 다른 글

Kotlin SingleTon with Fragment  (0) 2021.10.06
[공유] RecycleView Animation  (0) 2021.08.23
ANR(Application Not Responding)  (0) 2021.08.18
Dagger2 DaggerAppComponent Not Found  (1) 2021.08.11
[Kotlin] 기본  (0) 2020.09.24