본문 바로가기

안드로이드 기술 공유

Android DataBinding vs Kotlin Extensions 의 XML 레이아웃 접근, 어떤 방식이 더 좋을까?

MVVM 아키텍처와 코틀린을 같이 하다 보니, XML 레이아웃 뷰 접근을(findViewById) 대체할 수 있는 방식이 서로 달라서, 과연 어떤 방식으로 하는 게 좋을까? 라는 궁금증이 생겼습니다.

 

MVVM 아키텍처를 위해 DataBinding 을 사용하고 있고, 코틀린을 위해 Kotlin Extensions를 사용하고 있다면,  

XML 뷰에 접근하기 위해 각자마다의 findViewById 대체 방법이 존재합니다.

 

우선, XML에 아래와 같은 TextView가 있다고 가정하고, 각자의 접근 방식에 대해 알아보겠습니다.

 

<TextView
    android:id="@+id/textview_title"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

 

[ DataBinding ]

binding.textviewTitle.text = "안드로이드"

 

[ Kotlin Extensions ]

textview_title.text = "안드로이드"

 

이렇게 두가지 방법으로 findViewById를 대체할 수가 있는데, 과연 어떤 방식이 더 좋고 선호되는 방식일까요?

 

항상 그래왔듯이, 우리에게 가장 좋은 샘플이 되는 Android Architecture Blueprints 에는 어떤 방식으로 사용하고 있는지 확인해보았습니다.

 

구글 블루프린트에는 DataBinding 방식으로 사용하고 있네요!

 

그 이유는 무엇일까 찾아보았습니다.

 

DataBinding 공식 문서에서 알수있듯이, DataBinding 메커니즘은 레이아웃의 findViewById() 메소드를 호출하는 것보다 더 빠르다고 나와있습니다.

이유는, 데이터바인딩 클래스 내에 xml파일의 각 뷰에 지정된 ID를 기반으로 하는 public final field VIew가 생성되기 때문에,

findViewById 보다 더 빠를 수 있는 이유입니다.

예를 들어, 아래와 같이 작성된 xml이 있고, generated를 통해 실제 내부 구현이 어떻게 되어 있는지 확인해보면,

 

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    ...
    <TextView
        android:id="@+id/text_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />  
    ...
</layout>

 

public final TextView textTitle;

 

이와 같이 뷰 ID를 기반으로 한, public final 프로퍼티가 생성되어 있는 것을 확인할 수 있습니다.

 

반면에, Kotlin Extensions는 findViewById()를 사용하고, 뷰 참조를 캐싱하는 방식을 사용하고 있기 때문에 findViewById()를 호출하지 않는 DataBinding의 방식이 더 효율적이라고 생각합니다.

 

이유는, findViewById()의 경우 캐스팅이 안전하지 않고, 레이아웃에서 참조하는 뷰가 실제와 다른 타입 일수도 있습니다.

특히, 개발자에게 익숙한 xml 레이아웃일수록 의외로 잘못된 참조가 자주 발생하기도 합니다. (발견 후, 굉장한 허탈감에 빠질 수도...)

또한, findViewByID() 또는 Kotlin Extensions를 사용하여 뷰에 접근하는 방식은 null에 안전하지 않기 때문에, 레이아웃 생명주기에 어긋나거나 잘못된 ID를 참조하는 경우 NullPointerException이 발생하게 됩니다.

 

이러한 문제를 보완하기 위해 나온 것이 View Binding 이기도 하죠.

그렇기 때문에, findViewById()를 사용하지 않는 DataBinding이 훨씬 더 효율적이고, 개선된 방식이라고 할 수 있습니다.

 

또한, 안드로이드 스튜디오 3.6 릴리즈 버전에는 아예 View binding 기능이 추가되어서, findViewById()를 완전히 대체하도록 하였고, 

Google의 UDACITY 코틀린 학습 과정에서도 DataBinding 사용을 권장하고 있으니,

결과적으로 DataBinding 방식이 더 효율적이고 선호되는 방식이라고 할 수 있습니다 ^^