본문 바로가기

Android/UI

[UI] DataBinding..? ViewBinding...?

DataBinding, ViewBinding전에! Binding이란??

- Binding

Binding이란 Android 개발 시 Activity나 Fragment에서 Layout내의 View들을 참조하기 위한 변수들을 연결해 주는 행위라고 얘기할 수 있다. 이런 역할을 해주는 Binding class들을 가지고 귀찮은 과정 없이 View들을 바로 참조할 수도 있는 거고, View들에 데이터를 바로 넣어줄 수도 있는 거다.

DataBinding?

- Binding

DataBinding이란 XML에서 직접 View에 데이터를 할당하기 위해 사용하는 Android Jetpack 라이브러리 중 하나이다. DataBinding을 사용하지 않으면 findViewById와 같은 메서드를 사용해서 실시간으로 모든 리소스 트리를 뒤져서 해당 데이터를 찾아가야 하는데, 이는 프로그램의 리소스를 많이 잡아먹을 뿐만 아니라 코드 길이가 불필요하게 길어지는 문제를 초래한다.

하지만 굳이 DataBinding을 사용하지 않고 findViewById를 사용해도 되는 것이 아닌가?라고 생각이 들 것이다. 만약 DataBinding을 사용하지 않고 findViewById를 사용해 개발을 진행하게 된다면 여러 View에 데이터를 할당해야 하는 상황이 생긴다면 아래와 같은 상황이 생길 수 있다.

 

 

문제 코드

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // findViewById를 사용하여 모든 View를 찾아서 변수에 할당
        val textView1 = findViewById<TextView>(R.id.textView1)
        val textView2 = findViewById<TextView>(R.id.textView2)
        val textView3 = findViewById<TextView>(R.id.textView3)
        val textView4 = findViewById<TextView>(R.id.textView4)
        val textView5 = findViewById<TextView>(R.id.textView5)
        val button = findViewById<Button>(R.id.button)

        button.setOnClickListener {
            textView1.text = "Updated TextView 1"
            textView2.text = "Updated TextView 2"
            textView3.text = "Updated TextView 3"
            textView4.text = "Updated TextView 4"
            textView5.text = "Updated TextView 5"
        }
    }
}

위와 같은 문제를 해결하기 위해 DataBinding을 사용할 수 있다. 간단하게 어떤 방식으로 사용하는지 알아보자

사용방법

1. 먼저 build.gradle파일에서 DataBinding을 활성화해 준다.

android {
    dataBinding {
        enabled = true
    }
}

2. 그 후 Layout파일에 data태그를 추가하여 DataBinding을 설정한다.

<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <variable
            name="viewModel"
            type="com.example.app.MainViewModel" />
    </data>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <TextView
            android:id="@+id/textView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{viewModel.text}" />
    </LinearLayout>
</layout>

3. Activity에서 DataBinding을 사용하는 예제코드이다.

class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding

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

        val viewModel = MainViewModel()
        binding.viewModel = viewModel
        binding.lifecycleOwner = this
    }
}

 

 

ViewBinding?


- ViewBinding

ViewBinding이란 DataBinding과 비슷하게 Activity나 Fragment에서 직접 XML의 View를 참조하기 위해 사용되는 라이브러리이다. ViewBinding과 DataBinding은 서로 크게 차이가 없을뿐더러 장점 또한 서로 동일하다.

사용방법
1. build.gradle파일에서 ViewBinding을 활성화해 준다.

android {
    viewBinding {
        enabled = true
    }
}

2. Layout파일에 대해 생성된 바인딩 클래스를 사용한다.

class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        binding.textView.text = "Hello, ViewBinding!"
    }
}

그렇다면 도대체 왜 ViewBinding과 DataBinding으로 나눠진 걸까?

바로 이 두 방식은 서로 사용 목적이 약간 다르다. 쉽게 얘기해 보자면 DataBinding이 ViewBinding의 기능도 포함한다고 말할 수 있다. 앞서 설명한 두 방식의 개념을 한번 다시 짚어보자

DataBinding : XML에서 View에 직접 데이터를 할당하기 위해 사용

ViewBinding : XML의 View를 직접 참조하기 위해 사용

즉 ViewBinding은 위의 내용처럼 오직 코드에 View를 Binding 하기 위해 사용된다. 하지만 DataBinding은 ViewBinding의 기능뿐만 아니라, 데이터를 직접 View에 Binding 한다.

두 기술의 중요한 차이는 3가지 정도 있는데 바로 아래와 같다.

1. ViewBinding은 XML에서 layout, data태그가 없는 단순한 XML Layout에서도 사용 가능하다.

2. XML에서 View에 데이터를 Binding 하기 위해 ViewBinding을 사용할 수 없다. ViewBinding은 양방향 Binding 방식이 아니다.

3. ViewBinding의 주요 장점은 빠르고 효율적이다. DataBinding에 관련한 오버헤드 및 성능 이슈를 피할 수 있어 빌드에 시간이 적게 소요된다.

 

 

이해하기 어렵다면 아래의 그림을 봐보자

즉 상황별로 ViewBinding과 DataBinding을 적절히 사용해야 하는 것이다.

 

굳이 DataBinding을 사용하지 않아도 되는 부분에서 DataBinding을 사용할 필요는 없다. DataBinding을 사용하지 않아도 되는 부분이란 건 바로 Activity나 Fragment에수 View를 참조해야 하는 상황을 말한다.

이럴 땐 굳이 XML에서 View들을 layout 태그로 묶지 말고 그냥 빠른 ViewBinding 방식으로 간단하게 Layout을 inflate 해서 사용하면 되는 것이다.

 

뷰를 단순히 참조만 하고 싶을 땐 ViewBinding을 사용하고, RecyclerView + Adapter를 사용하여(예시) 데이터를 바로 뷰에 바인딩하고 싶을 땐 DataBinding을 사용하면 된다.

 

 

참고한 자료

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

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

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

[XML] ConstraintLayout.. LinearLayout.. 각종 Layout을 알아보자!  (0) 2024.06.25
[UI] Compose SideEffect?  (0) 2024.05.24