Android-Kotlin/JetPack

[Android] DataBinding 개념 및 간단 사용법 - Kotlin

주톨 2022. 6. 21. 06:39
728x90

 

 

DataBinding 이란?

 

 

DataBinding이란 안드로이드 JetPack 라이브러리 중 하나로 Activity, Fragment의 데이터를
화면에 출력하기 위해 도와주는 AAC(Android Archiecture Component)의 기법입니다.
주로 MVVM 디자인패턴에서 사용합니다.

 

 

DataBinding 장점

  1. Activity에서 View에 접근하는 보일러 플레이트 코드를 작성하지 않아도 된다.
  2. 파일이 더욱 단순화 되어 유지관리가 쉬워진다.
  3. 메모리 누수방지, null 위험을 방지할 수 있다.

 

DataBinding 단점

  1. Class파일이 많이 생겨 빌드속도가 느려지고 앱 용량이 증가한다.
  2. xml에서 사용할 경우 디버깅이 힘들다.

그래서 FindViewById 만을 대체하기 위해 사용할 경우에는

DataBinding 보다 더 작은 개념인 ViewBinding을 사용하는 것이 좋다.

 

 

DataBinding  vs ViewBinding 

  • Binding은 2가지 종류가 있다.
  • DataBinding이 더 큰 개념이다.
  • 그래서 DataBinding을 이용하면 ViewBinding 처럼 이용 가능하다.

 

 

 

DataBinding 간단 사용법

 

 

DataBinding을 사용하기 위해서는 라이브러리 선언을 해야합니다. ( build.gradle - Module)

android {
    ...
    buildFeatures {
        dataBinding true
    }
}

그리고 새 프로젝트를 생성해주세요!

 

 

1. activity_main.xml 

일단 간단하게 화면 구성부터 먼저 하겠습니다.

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="이름이 들어올거에요!"
        android:textSize="40sp"
        android:layout_gravity="center"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="나이가 들어올거에요!"
        android:textSize="40sp"
        android:layout_gravity="center"
        android:layout_marginTop="30dp"/>

</LinearLayout>

 

TextView 2개가 있는 간단한 화면입니다.

 

여기서 DataBinding을 사용할 겁니다. xml 에서 레이아웃을 사용하기 위해서는 
우리가 만든 코드 전체를 <layout> </layout> 으로 감싸야 합니다.

 

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

    <LinearLayout 
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:gravity="center"
        tools:context=".MainActivity">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="이름이 들어올거에요!"
            android:textSize="40sp"
            android:layout_gravity="center" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="나이가 들어올거에요!"
            android:textSize="40sp"
            android:layout_gravity="center"
            android:layout_marginTop="30dp" />
    </LinearLayout>
    
</layout>

 

 

 

그리고 이 layout에 해당 부분을 추가해야 하는데  <data> </data> 안에  Layout에서 사용할 변수를 만드는것 입니다.

<variable  name = "변수명"  type = "어느패키지에 어느클래스를 사용할것 인가.">  

 

필자는 com.jutole.databinding 패키지에 User라는 dataClass를 생성했다.

 

 

 

마지막으로 이부분을 수정하면 된다. 우리가 위에서 만든 xml 변수를 사용하려면  @{ }  안에서 사용해야한다!

왜 @{profile.name}  인가.. 이해가 안 됐을 분들을 위해서 추가 설명..

 

우리는 위에서 xml 변수를 만들고 변수명을 profile로 만들었다.

그리고 사용할 클래스는 User 클래스로 만들었다.

User 클래스가 가지고 있는 정보? 내용? 은 name과 age 이다. 

그럼 profile.name 은 이해가 될것이다.

 

@{String.valueOf(profile.age)}   이 부분은 특별할것은 없다. 그냥 Int형태로 받아온 age(나이)를

text에 띄우기 위해 String으로 바꾸는 작업이다.

 

 

2. MainActivity

MainActivity는 간단하다.

 

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding: ActivityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main)
        binding.profile = User("주톨", 24)
    }
}

이게 끝이다.. 생성 시 코드랑 달라 진점은 하나 뿐이다.

 

setContentView(R.layout.activity_main)
                          ↓
val binding : ActivityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main)

 

*코드설명

 

기존에는 Activity에 화면을 보여주기 위해서는 XML에 정의된 각 위젯들이 정의된 속성을 지정하고 상하관계에 맞춘 뒤
메모리에 올려야하는데
 이러한 작업을  Activity에 setContentView() 함수에서 했습니다.

 

하지만 우리는 DataBinding을 사용할것이기 때문에 DataBindingUtil 에 있는 setContentView를 사용할겁니다.

val binding : ActivityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main)  →
val 변수명 : ActivityMainBinding  = DataBindingUtil.setContentView(어느액티비티에띄울것이냐, 어떤레이아웃을)

binding(변수명)에는 해당 layout에 대한 정보를 담고 있다. ex) layout에서만든변수,  만든 View의 ID 등등...

binding.profile = User("주톨", 24)   →

biding에는 layout에만든 변수에 대한 정보가 있으므로 layout에서 만든 변수 profile에 값을 넣어주겠다 이 말입니다.

어떤값을? User클래스에서 생성한 객체를 넘겨주겠다. (User클래스는 우리가 따로만든 dataClass이다. 위에보면 있다)


이 걸로 코드구현은 끝났다. 실행해보자 !

 

 

 

 

봐주셔서 감사합니다. 이해안가는 부분이나 틀린 부분이 있다면 댓글로 알려주세요

 

.