이번엔 데이터 바인딩에 대해 알아보자.
데이터 바인딩이란?
공식 문서 ↓
Android Jetpack의 구성 요소 중 하나로, 프로그래매틱 방식이 아닌 선언형 방식으로써
UI 구성요소를 앱의 데이터와 결합할 수 있도록 지원하는 라이브러리다.
일반적으로 View에 데이터를 할당하려면 다음과 같은 절차가 필요하다.
TextView textView = findViewById(R.id.textView);
textView.setText(viewModel.name);
데이터 바인딩은 xml 파일에서 직접 View에 데이터를 할당한다.
<TextView
android:text="@{viewModel.name}"
/>
위 처럼 레이아웃 파일에서 데이터를 View와 바인딩하게 되면 코드를 작성하는 파일에서
View를 참조하는 부분이 삭제되기 때문에 파일이 가벼워지고 유지·보수 또한 편리해진다.
자세한 내용은 직접 사용해보며 확인해보자.
사용해보자
✅ 그래들 요소 추가
build.gradle(모듈 수준)에 다음 요소를 추가한다.
android {
...
dataBinding {
enabled = true
}
}
✅ 레이아웃 파일
데이터 클래스로 Student 클래스를 만들어 줄 예정인데,
이미 생성했다고 가정하고 xml 파일부터 보자.
activity_main.xml
<layout>
<data>
<variable
name="student"
type="com.example.databinding_test.Student"
/>
</data>
<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"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{student.name}"
/>
</LinearLayout>
</layout>
파일 첫 부분부터 익숙하지 않은 문법이 보일 수 있다.
데이터 바인딩을 사용하기 위한 일련의 과정이다.
● 데이터 바인딩을 사용하기 위해서는 레이아웃 전체 코드를 <layout> 태그로 감싸줘야 한다.
● 레이아웃 파일에서 데이터를 다루기 위해 <data>, <variable> 태그를 추가해줬다.
<variable> 태그 내 type 속성으로 다른 클래스를 참조해올 수 있다.
여기서는 Student 클래스를 참조해왔다.
● TextView의 text 속성에 데이터 바인딩 문법이 사용되었다.
일반 텍스트가 작성될 곳에 위와 같이 "@{데이터}" 이렇게 작성해주면 된다.
✅ 데이터 클래스
간단하게 학생의 이름만 들어갈 데이터 클래스를 만들어 주겠다.
Student.java
public class Student {
String name;
public Student(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
✅ 액티비티
액티비티의 onCreate() 부분에서만 다루겠다.
MainActivity.java
public class MainActivity extends AppCompatActivity {
ActivityMainBinding binding;
Student student;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 바인딩 객체에 setContentView()
binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
// LifecycleOwner 지정
binding.setLifecycleOwner(this);
binding.checkBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
student = new Student("Oscar");
// 레이아웃 파일의 Student 변수에 Student 객체 할당
binding.setStudent(student);
}
});
}
}
앞선 뷰 바인딩 포스팅에서도 언급했던 내용이지만, 바인딩 클래스는
xml 파일 이름을 카멜 표기법으로 변환하고 Binding을 붙여 자동 생성된다.
재미있는 점은, 레이아웃 파일에 Student 변수를 선언해주면
위 처럼 바인딩 클래스에 setStudent() 메서드도 자동 생성되고,
데이터 클래스의 getter() · setter() 메서드도 알아서 활용하여 적용해준다.
기존의 레이아웃 참조 방식인 setContentView()를 바인딩 객체에 할당했기에
뷰 바인딩과 같이 해당 레이아웃의 모든 View를 참조해올 수 있다.
그 외 중요 부분에 모두 주석을 달았으니 확인하기 바란다.
✅ 결과
✅ 정리
▶ 레이아웃 파일에 데이터를 다룰 클래스 선언
▶ 레이아웃 내 데이터가 들어갈 View에 데이터 선언
▶ 액티비티에서 데이터 바인딩 객체 생성 후 레이아웃 파일 연결
▶ 바인딩 객체에 LifecycleOwner 지정
▶ 바인딩 객체에 레이아웃 파일에 선언한 클래스 변수 할당
데이터 바인딩과 뷰 바인딩
앞선 포스팅에서 뷰 바인딩에 대해서도 다루어 보았다.
데이터 바인딩을 사용해보면 느끼겠지만,
뷰 바인딩이 지원하는 기능은 데이터 바인딩도 모두 지원한다.
데이터 바인딩은 뷰 바인딩을 포함하고 있다고 볼 수 있다.
✅ 그럼 뷰 바인딩을 왜 써? 데이터 바인딩만 쓰면 되지
뷰 바인딩은 비교적 단순한 사용 사례를 처리하기 위해 사용된다.
● 데이터 바인딩보다 컴파일 시간이 더 짧다.
선언형 방식은 컴파일 시간 동안 레이아웃에 작성된 데이터 관련 코드를 처리하기에
뷰 바인딩에 비해 오랜 시간이 걸린다.
● 사용 편의성이 더 좋다.
데이터 바인딩을 사용하기 위해서는 바인딩할 데이터를 xml 파일에 태그하는 등
기본 구조를 미리 설계해야 하기에 더 복잡한 면이 있다.
● 데이터 바인딩 안드로이드 공식 문서에서도 다음과 같이 언급하고 있다.
결론적으로 단순한 사용 사례를 적용하려면 뷰 바인딩을,
그것이 아니라면 데이터 바인딩을 채택하는 것을 추천한다.
이번 포스팅에서는 데이터 바인딩에 대해 알아보았다.
구글에서 권장하는 아키텍처이기도 하고,
그만큼 사용성도 좋다고 느낀다.
'Android (안드로이드)' 카테고리의 다른 글
[Android] 디자인 패턴 - MVC 패턴 / 예제 (0) | 2024.02.14 |
---|---|
[Android] LiveData / MutableLiveData / 라이브 데이터 / 사용법 / 예제 (0) | 2024.02.13 |
[Android] ViewBinding / 뷰 바인딩 / 사용법 / 예제 (2) | 2024.02.09 |
[Android] HTTP 통신 라이브러리 비교 / Volley · OkHttp · Retrofit (0) | 2024.01.26 |
[Android] HTTP 통신 라이브러리 - Retrofit / 예제 / 사용법 (4) | 2024.01.25 |