[ACC] 데이터 바인딩 기초

2021. 2. 14. 13:28바삭바삭 IT/안드로이드

ACC(안드로이드 아키텍처 컴포넌트)에서 가장 인기있는 패키지 중 하나인 '데이터 바인딩'을 소개합니다.

 

데이터바인딩을 이용하면 액티비티 코드를 간결하게 줄일 수 있습니다. 기존에는 아래와 같이 findViewById()를 여러번 호출해야 했습니다. 

 Button button;
 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 		button = findViewById(R.id.button);
 }

하지만 데이터바인딩을 이용하면 위 코드를 xml에서 대신 처리해주면서 액티비티에서 했던 ui작업이 아주 간단하게 바뀝니다. 사용방법부터 알아볼까요?


사용법

1. 먼저 모듈수준의 gradle파일에 아래처럼 추가해야합니다.

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

2. 데이터 바인딩을 쓰는 xml을 <layout> 태그로 감싸줍니다.

 <layout>태그만 감싸도 액티비티에서 findViewById()를 할 필요 없이 뷰객체를 바로 사용할 수 있습니다. 내부적으로 이 태그를 감싼 xml으로 클래스가 생성되기 때문입니다. 위에서 activity_main.xml이였다면 ActivityMainBinding클래스가 자동으로 생성됩니다. (test.xml이면 testBinding가 되는것!) 이 바인딩 클래스로 xml에 선언된 뷰 객체를 직접 가져올 수 있는거죠.

 

 <data>태그를 선언하면 코드의 데이터가 자동으로 뷰 객체에 대입됩니다. <variable>태그에 선언된 변수는 ActivityMainBinding클래스에서 자동으로 getter setter함수가 만들어 집니다.

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <variable
            name="user"
            type="com.example.test.model.User" />
    </data>

    <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

      <Button
          android:text="@{user.name}"
          android:id="@+id/button"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"/>

</LinearLayout>
</layout>

※ xml에서 데이터바인딩할때 눈에띄지 않는 오타 때문에 cannot find symbol xxxxBinding에러가 날 수 있으니, 주의해야 합니다!

 

3. 액티비티 클래스에서 binding객체 생성하기

 액티비티 코드를 작성하기 전에 Build탭의 Rebuild Project를 해줍니다. 그 이유는 아래 사용하는 바인딩 클래스가 컴파일러에 의해 생성되기 때문입니다.

ActivityMainBinding binding;
 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
 		binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
        binding.setUser(new User("홍길동"));
 }

작동원리

내부에서는 어떻게 xml파일명으로 binding클래스 파일을 만들어 내는 것일까요? 위에서 설명했듯이 activity_main.xml을 빌드하면 ActivityMainBinding.java파일이 컴파일시에 생성된다고 했습니다. 이 파일은 메인폴더에 나타나지 않고 개발자가 건드릴 수도 없습니다. 눈으로 볼 순 없지만 xml코드를 java코드로 바꿔놓았을 것입니다.

 

위 예에서 binding.setNumberText를 보면 알수 있듯이 ActivityMainBinding클래스에서 setUser함수를 개발자가 추가하지도 않았는데 자동으로 만들어진 것입니다. 클래스 안에 setter가 생긴것이죠. 

public abstract void setUser(@Nullbale String name)

그럼 xml에서 아래 코드는 어떻게 작동할까요? 

<Button>
	android:text="@{user.name}"
    ....

다음과 같은 과정을 거치게됩니다.

1. User모델 클래스에서 getter함수를 찾습니다. 위 예시에선 getName()이 되겠죠.

2. 선언되있지 않다면 public String name 필드를 찾습니다.

3. getter, 필드 모두 없다면 numberText()를 호출하는데 이 함수도 없다면 에러가 발생합니다.

 


이와 같은방식으로 모델클래스 외에도 리소스, 컬렉션타입데이터, 이벤트 등을 바인딩 할 수도 있습니다. 

결론적으로 데이터바인딩은 mvvm모델로 개발하는데 유용한 도구라고 할 수 있습니다. :) 

 

반응형