본문 바로가기

TIL

[TIL] Kotlin DataBinding/ DataBinding과 ViewBinding과 차이

[오늘 배운 내용]

-1- DataBinding

 

DataBinding이란?

  • DataBinding은 xml 레이아웃 파일과 Activity, Fragment 등의 UI컴포넌트를 자동으로 바인딩하는 라이브러리다, DataBinding은 ViewBinding과 같이 Acitivty, Fragment에서도 Layout의 오브젝트들에 접근이 가능하며 layout의 xml 안에서도 변수를 선언하는 등 양뱡향의 통신이 가능하다.
  • Layout 파일에서 컴포넌트를 바인딩함으로 Activity에서 많은 UI 프레임 워크 호출을 하지 않을 수 있어 파일이 더 단순화 되고 유지관리가 쉬워진다. 

 

 

ViewBinding과의 차이점

 

1. ViewBinding을 사용하게 되면 Layout에 Layout 태그가 필요하지 않다.

  • DataBinding은 루트Layout 을 씌워주어야 함. 

 

2. ViewBinding은 xml의 데이터와 레이아웃을 바인딩할 수 없다

  • DataBinding은 루트Layout 내에 Data 태그를 통해 xml 내부에서 데이터를 정의할 수 있기 때문에 가능하다.

 

 

3. ViewBinding이 더 빠르다

  • 바인딩 객체 생성시기의 차이
    • ViewBinding은 컴파일 시점에 바인딩 클래스를 생성하므로, 실행 시간에 추가적인 초기화 과정이 필요하지 않은 반면 DataBinding은 실행 시점에 데이터 바인딩을 위한 초기화 작업이 필요하므로 빌드가 오래 걸린다.
  • 데이터 업데이트 오버헤드 
    • ViewBInidng은 단반향으로 동작하여 데이터의 변경을 감지하고 UI 업데이트를 수동으로 처리하지 않는다. 이로인해 데이터 업데이트와 관련된 오버헤드가 적어진다. 반면에 DataBinding은 양방향 데이터 바인딩을 지원하며 LiveData나 ObservableField와 같은 관찰 가능한 객체를 사용하여 UI의 자동 업데이트를 처리한다.
  • 퍼포먼스 최적화
    • ViewBindind은 단순한 바인딩 매커니즘만 제공하기 때문에 더 가볍고 경량화된 구조를 가지고 있고. xml파일 내에서 표현되는 변수나 식 등의 추가 코드가 필요하지 않기 때문에 xml파일 크기가 상대적으로 작아 빌드 시간 및 앱 크기를 줄이는 데 도움이 된다.

 

4. 바인딩 객체 생성시기의 차이

  • 위에서 언급한대로 ViewBinding은 컴파일 시점에서 바인딩 클래스를 생성하므로 단순히 XML레이아웃 파일의 뷰 계층 구조에 대한 바인딩을 생성하고 반환할 수 있다.
  • XML레이아웃 파일의 최상위 뷰에 대한 참조를 제공하므로, 해당 뷰 계층 구조가 Activity나 Fragment의 컨텐츠로 설정 된다.
  • ViewBinding 호출방법
class MainActivity : AppCompatActivity() {
    private lateinit var binding : ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(binding.root)
        ...   
    }
}

 

 

  • DataBinding 호출방법
    • DataBindingUtil.setContentView() 메서드를 사용하여 호출한다.
    • DataBindingUtil.setContentView() 는 XML 레이아웃 파일의 최상위 컨테이너인 <Layout> 태그에서 정의된 변수와 바인딩 객체 사이에 연결을 수립하여 Activity나 Fragment 내부에서 사용할 수 있는 바인딩 객체를 생성하고 반환합니다.
class MainActivity : AppCompatActivity() {
    private lateinit var binding : ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
        
        ...
    }
}

 

참고용 기능 비교표

비교표

 

ViewBinding한테 다 밀리는데 사용하는 이유?

  • ViewBinding은 단순한 View를 액세스하기 위해 사용되고 가독성 및 유지 보수성을 높여주는 반면 복잡한 UI 및 데이터 모델 간의 상호작용을 처리하는데에는 어려움이 있기 때문에 데이터 바인딩, 컨버터, 바인딩 어댑터 등 다양한 기능을 필요로 하는 상황에서는 DataBinding을 사용하여 UI업데이트 로직을 명시적으로 작성하지 않고도 데이터 변경 시 자동으로 UI가 업데이트 되도록 한다. DataBinding은 주로 ViewModle, LiveData와 함께 사용된다 
  • VIewBinding은 양방향 바인딩이 불가능한 반면 DataBinding은 데이터와 UI 양방향의 바인딩이 가능하여 데이터 변화에 UI가 자동으로 반응하기 때문에 MVVM 패턴과 같이 UI 및 데이터 모델 간의 상호작용을 처리하는데 적합함

 

 

 

적용방법

build.gradle

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

 

 

Data 생성 - 주로 ViewModle, LiveData 사용함

  • xml에서 더하기 버튼, 빼기 버튼 Text를 설정하기 위해 data클래스 만들어두기.
data class Button(
    val feature : String,
)

 

XML생성

  • xml 내부 data 태그 안에서 변수를 생성한다.
  • @{data.파라미터} 로 해당 파라미터를 불러온 값을 Text값에 넣어준다
  • XML파일에서의 함수 연결 예시를 위해 sub_button의 onClick이벤트를 MainActivity의 btnClick 함수와 XML에서 연결해주었다.
<layout xmlns:tools="http://schemas.android.com/tools"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <data>
    < !-- 데이터 태그 내부에 변수 선언 --- >
        <variable
            name="add_button"
            type="com.example.databinding_recyclerview.Button" />
        <variable
            name="sub_button"
            type="com.example.databinding_recyclerview.Button" />
    </data>
<androidx.constraintlayout.widget.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/tv_number"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="130dp"
        android:text="Number"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/btn_add"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="80dp"
        android:layout_marginTop="110dp"
        android:text="@{add_button.feature}"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/tv_number" />

    <Button
        android:id="@+id/btn_sub"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="110dp"
        android:layout_marginEnd="80dp"
        android:text="@{sub_button.feature}"
        android:onClick="btnClick"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/tv_number" />

</androidx.constraintlayout.widget.ConstraintLayout>
</layout>

 

 

MainActivity.kt

  • ViewBinding의 경우 setContentView(binding.root)의 식으로 setContent를 
  • xml 내부에서 생성해둔 변수 add_button과 sub_button에 접근해서 값을 넣어줄 수 있다. ViewBinding과 같이 Activity에서도 클릭 리스너, text지정을 할 수도 있으며, 생성해둔 함수를 XML에서 연결할 수도 있다.
class MainActivity : AppCompatActivity() {
    private lateinit var binding : ActivityMainBinding

    var score : Int = 0

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
        binding.tvNumber.text = score.toString()

        val addBtn = Button("더하기")
        val subBtn = Button("뺴기")
        binding.addButton = addBtn
        binding.subButton = subBtn
        binding.btnAdd.setOnClickListener {
            score++
            binding.tvNumber.text = score.toString()
        }
    }

    fun btnClick(view: View){
        score--
        binding.tvNumber.text = score.toString()
    }
}

 

 

 

 

 


 

[오늘 복습한 내용]

1. DataBinding을 공부하면서 ViewBinding도 복습해서 좋은 것 같다 둘의 차이점을 찾다보니 덩달아 복습.

 

2. RecyclerView도 복습. DataBinding의 RecyclerView 적용에 대해서 배우면서 복습

 

 


[오류,에러 등등]

1. 특별한 오류는 없었다.

 

 


[느낀 점]

1. 어렵다.

 

2. 재밌다.

 

3. 틈틈이 쉬면서 멀리보는 습관을 가져야겠다 눈 아프다

 

 


[Reference]

 

// DataBinding
https://dev.to/samuelwahome/view-binding-in-android-4im0

https://notepad96.tistory.com/185

https://warmdeveloper.tistory.com/51

https://philosopher-chan.tistory.com/1307

https://developer.android.com/topic/libraries/data-binding?hl=ko