Android

데이터 바인딩 (1) : 기본 사용법

까망사과 2022. 10. 29. 01:00

데이터 바인딩이란 UI와 앱 데이터를 선언적으로 결합하기 위해 사용하는 라이브러리다.

 

일반적으로는 레이아웃 파일에 선언한 뷰를 액티비티나 프래그먼트 등의 컴포넌트에서 참조하고 제어한다.

하지만 데이터 바인딩을 사용하면 레이아웃 파일에 뷰를 선언하는 동시에 데이터 변수를 참조할 수 있다.

이렇게 하면 데이터가 변경됨에 따라 뷰가 자동으로 갱신되도록 만들 수 있다.

 

기본적으로 뷰 바인딩 기능을 포함하므로 레이아웃 파일의 데이터 변수뿐 아니라 뷰를 참조할 수도 있다.

따라서 findViewById() 같은 UI 프레임워크를 여러 번 호출하지 않아도 된다.

 

또한 데이터 바인딩은 MVVM 아키텍처 패턴에서 중요한 역할을 한다.

 


데이터 바인딩 사용 설정

뷰 바인딩과 마찬가지로 모듈 레벨 build.gradle 파일에서 사용 여부를 설정한다.

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

 

사용 설정을 하고 나면 각 레이아웃 파일에 대한 바인딩 클래스가 생성된다.

바인딩 클래스의 이름은 레이아웃 파일 이름을 파스칼 케이스로 변환하고 끝에 Binding을 붙인 것이다.

 


데이터 바인딩 사용하기

일반적으로 LinearLayout, ConstraintLayout 등의 뷰 컨테이너를 루트 요소로 사용한다.

하지만 데이터 바인딩을 사용할 경우 <layout>을 루트 요소로 사용해야 한다.

 

<layout> 요소는 크게 두 부분으로 나뉜다.

하나는 바인딩할 데이터 및 변수에 대한 정보를 포함하는 <data> 요소, 나머지 하나는 UI를 나타내는 뷰 컨테이너 요소다.

 

변수 선언

데이터 변수는 레이아웃 파일의 <data> 요소 안에 <variable> 요소로 선언한다.

<variable> 요소는 다음 속성들을 포함한다.

  • name
    변수의 이름
  • type
    변수의 타입. 패키지명이 포함된 클래스 경로다.

선언한 변수에 대한 게터 및 세터는 데이터 바인딩 클래스 안에 자동으로 만들어진다.

 

데이터 바인딩 클래스 인스턴스화

액티비티나 프래그먼트에서 데이터 바인딩 클래스를 인스턴스화하여 사용한다.

바인딩 클래스의 정적 메서드인 inflate()bind()를 사용하는 것이 일반적이지만 바인딩 타입을 바로 알 수 없는 경우 DataBindingUtil 클래스의 정적 메서드를 사용할 수도 있다.

 

예를 들어 액티비티에서는 다음처럼 데이터 바인딩을 사용할 수 있다.

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        
        // 일반적인 경우
        val binding: ActivityMainBinding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
        
        // DataBindingUtil을 사용하는 경우
        val binding: ActivityMainBinding = DataBindingUtil.setContentView(
            this, R.layout.activity_main
        )
    }
}

 

바인딩 표현식 사용하기

레이아웃 파일에서 "@{}" 구문을 사용하여 <data> 요소에서 선언한 변수를 참조할 수 있다.

자세한 표현식 문법은 다음 가이드를 참고하자.