안드로이드를 배우면 초반에 findViewById()
를 많이 쓰는데
이 findViewById()는 런타임시 뷰의 계층을 타고타고 들어가는 비효율적
인 함수이다.
간단한 앱에서는 괜찮았지만, 앱이 커지면 효율이 떨어진다 😢
Data Binding을 사용하면 쉽게 View에 접근할 수 있고, 코드도 간결해진다!!
또한 MVVM 아키텍쳐에서 주로 사용하는 방법이기도 하다.
Data Binding에 대해 적어볼까 한다.
포괄적인 의미로 앱 UI와 해당 UI가 표시하는 데이터를 연결하는 프로세스이다.
바인딩 설정이 올바르고 데이터가 적절한 알림을 제공하는 경우 데이터 값이 변경될 때 데이터에 바인딩 된 요소에 변경 사항이 자동으로 반영된다.
즉, 데이터 바인딩(Data Binding)은 UI 요소와 데이터를 프로그래밍적 방식
으로 연결하지 않고, 선언적 방식
으로 결합할 수 있게 도와주는 라이브러리이다.
사용자가 TextBox
요소의 값을 편집하면 내부 데이터 값이 자동으로 업데이트 되어 해당 변경 내용이 반영된다.
사용해보기 전에 프로그래밍적 방식과 선언적 형식이 무엇인지 부터 알아보자!!
🤔 프로그래밍적 방식 vs 선언적 형식
프로그래밍적 방식이란?
findViewById()
로 데이터와 결합해준 후 데이터를 할당하는 방식이다.선언적 형식이란?
레이아웃 파일(xml)에서 직접 할당
해주는 방식이다.imperativeBtn = findViewById(R.id.imperative_btn);
imperativeBtn.setText("imperativeBtn");
imperativeBtn.setOnClickListener(view -> {
// something...
});
<Button
android:id="@+id/imperative_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
build.gradle(Module:app) 내부 android {…} 태그 사이에 아래 코드 추가해준다.
dataBinding {
enabled = true
}
🖐🏻 이때 안드로이드 버전이 4.0 이상이라면 아래 코드를 사용해준다.
android {
...
buildFeatures {
dataBinding = true
}
}
public class User {
private final String name;
private final int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
User 클래스에 2개의 Getter 메서드가 존재한다. 이 Getter 메서드는 XML 에서
@{user.age}= getAge(), @{user.name} = getName()
으로 엑세스 된다.
xml 레이아웃을 <layout> </layout>
태그로 감싸준다.
선언되어있는 Layout에서 Alt + Enter
를 누르면 나오는 Converter to data binding layout
선택!!!!
<data> </data>
태그 사이에 <variable>
태그를 사용하여 해당 xml 내부에서 사용할 수 있는 변수 할당한다.!!
<data>
태그로 선언한 변수는 "@{}"
구문을 이용해 view의 속성값에 대입하여 사용할 수 있다.
💡 사용 가능한 표현식의 종류 확인하러 가기!!
3항 연산자 같은 간단한 식을 넣을 수 있지만, 이 표현식은 단위 테스트가 불가능하고 IDE 지원이 제한적이기 때문에 아주 간단한 식을 사용하기 적절하다.
기본적으로 클래스 이름은 레이아웃 파일 이름을 기반으로 하여 파스칼 표기법으로 변환하고 binding을 추가한다.
_ex) activity_main.xml
파일 사용 시 -> ActivityMainBinding
클래스가 자동으로 생성된다.
⭐ 즉, Data Binding은 각 레이아웃 xml 마다 binding class를 자동으로 생성!!!
기본적인 사용방법은 여기서 끝!
findViewById()
를 사용하지 않고 자동으로 XML에 있는 View를 생성
하여 비효율성을 개선함
==> 앱의 Performance 상승 ⬆️
레이아웃 파일에서도 View에 어떤 데이터가 들어가는지 파악할 수 있다.
코드가 간결해짐
==> 가독성⬆️, 유지보수 쉬워짐
데이터의 변화에 따라 자동으로 View를 변경하게 할 수 있다.(Observer 사용시)
파일이 단순화되어 유지 관리가 쉬워지고 메모리 누수 방지, null 위험을 방지할 수 있다.
MVVM 아키텍쳐의 ViewModel과 함께 사용하기 좋다
다음에는 Kotlin으로 작성해서 올려야지><!