[Android/Kotlin 03] 데이터 바인딩(Data Binding) 기초

이다을·2023년 8월 3일
0

데이터 바인딩이란?

안드로이드 앱 개발에서 사용되는 기술로서, 뷰와 데이터를 간단하게 바인딩(연결)하여 UI를 업데이트하는 데 도움을 주는 라이브러리입니다. XML 레이아웃 파일에서 정의된 뷰와 액티비티 또는 프래그먼트에서 사용하는 데이터 간의 연결을 쉽게 만들어줍니다.

왜 써야할까?

XML 레이아웃 파일에서 화면 구성을 나타내고, 이 화면들을 코드에서 findViewById와 같은 메서드를 사용하여 연결해줍니다. 하지만 findViewById를 통한 검색은 번거로우며, 코드가 복잡해지고 유지보수가 어려워질 수 있습니다.

이러한 문제를 해결하기 위해 데이터 바인딩은 데이터와 뷰를 자동으로 연결해주는 바인딩 어댑터를 제공합니다. 이렇게 하면 XML 레이아웃 파일에서 직접 변수나 데이터를 바인딩할 수 있으며, 뷰를 조작할 때 직접 findViewById를 호출할 필요가 없어집니다.(오!😏)

장점은?

  1. 코드의 가독성과 유지보수가 쉽습니다. 바인딩 하게 되면 XML 레이아웃과 Kotlin 코드 사이의 강력한 연결을 만들어 코드를 더욱 읽기 쉽고 유지보수하기 쉽게 만듭니다.

  2. 널 안정성: Kotlin의 주요 특성인 널 안전성을 제공합니다. 즉, 바인딩이 올바르게 구성되지 않은 경우 런타임에서 NPE(Null Pointer Exception)가 발생하지 않습니다.

  3. 생산성 향상: 바인딩 어댑터를 사용하면 뷰를 찾는 로직을 작성할 필요가 없으므로 코드 작성 시간이 줄어들고 개발자의 생산성이 향상됩니다.

특징은?

  1. 당연히 findViewById()를 사용하지 않아도 된다. 자동으로 xml에서 만든 View들을 만들어준다.

  2. RecyclerView 사용 시 각각의 item들을 set해주지 않아도 알아서 xml에서 처리할 수 있다.

  3. Observable을 이용해 실시간으로 데이터를 바꿔줄 수 있다.

그럼 무조건 데이터 바인딩?

정답은 땡입니다!
데이터 바인딩(DataBinding) 기능을 사용하지 않는다면 빌드 시간 및 APK 크기 측면에서 가벼운 뷰 바인딩(ViewBinding) 사용 권장하기 때문입니다.

val inputId = intent.getStringExtra("ID")
        val idText = findViewById<TextView>(R.id.getId) <- 이게 뷰바인딩
        idText.text = inputId

기본 세팅

  1. 데이터바인딩을 사용하기 위해서는 먼저 gradle 세팅을 해줘야 한다. build.gradle(Module : app)으로 들어가 다음과 아래 처럼 작성해 준다. -> Sync Now 클릭
android {
...
dataBinding {
        enabled true
    }
...
}
  1. 코드 전체를 layout으로 감싸줍니다.
<?xml version="1.0" encoding="utf-8"?>

<layout> <- 레이아웃
  <androidx.constraintlayout.widget.ConstraintLayout...>
      xmlns:app="http://schemas.android.com/apk/res-auto"
      xmlns:tools="http://schemas.android.com/tools">
      <data>
      ...
      </data>
      <LinearLayout
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:orientation="vertical">
          <Button
              android:id="@+id/btnSample"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:text="button"
           />

      </LinearLayout>
  </androidx.constraintlayout.widget.ConstraintLayout>
</layout> <- 레이아웃
  1. 사용할 엑티비티에 바인딩을 셋팅해줍니다.
// MainActivity.kt
private lateinit var binding: ActivityMainBinding
// xml 파일명이 CamelCase 표기로 바뀌고 Binding이 붙습니다.

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
    
    binding.testBtnId.setOnClickListener {
    	Toast.makeText(this, "click", Toast.LENGTH_LONG).show() <- 데이터 바인딩 사용
    }
}

이렇게 하면 뷰 바인딩을 사용했을 때처럼 똑같이 토스트 메세지가 뜨는것을 볼 수 있습니다.

profile
나도 개발 할래

3개의 댓글

comment-user-thumbnail
2023년 8월 4일

오 덕분에 몰랐던 걸 알게되었습니다 이해도 너무 잘되게 설명해주시네요!!

답글 달기
comment-user-thumbnail
2023년 8월 4일

오 새로운걸 알게 됐어요! 다음 코드에 적용해서 써봐야겠네요

답글 달기
comment-user-thumbnail
2023년 8월 4일

저도 아직 많이 부족한 개념인데 잘 정리해주셔서 잘 보고갑니다 :)
이해도가 많이 올라간 것 같아요 !

답글 달기