DataBinding 사용해보기

2020. 8. 17. 21:37android

1. 개념


이름 자체에서 직관적으로 알 수 있듯이 data들을 결합시켜 주는 역할을 하는 라이브러리입니다. Databinding을 사용하지 않았을 때는 findViewById 메서드를 통해서 ViewGroup내에 존재하고 있는 위젯들을 필드값과 연결시켜 줬습니다.

하지만 한 두개의 위젯이 아닌 수십 개의 위젯이라면 해당 개수만큼의 findViewById를 사용해서 위젯들을 연결시켜줘야 하는데 이렇게 하면 정말 코드가 길어지고 복잡해 보입니다. 뿐만아니라 위젯에 달아야하는 리스너를 등록하는 문제에 있어서도 코드를 길어지게 하는데 한 몫합니다..

 

이렇게 가독성이 떨어뜨리는 코드는 협업을 중요 시 하는 현재 추세에서는 매우 마이너한 방법입니다. 그래서 이런 문제들을 해결하고자 DataBinding이 나오게 되었습니다. DataBinding을 사용한다면 별도로 findViewById 메서드를 사용하여 위젯들과 연결할 필요없이, 객체를 통해 바로 viewGroup내의 위젯들에게 접근할 수 있습니다. 또한 xml 상에서 객체를 만들고 이 객체 내부의 값들을 xml상에서 처리할 수도 있습니다. 그럼 코드에서 처리하는 비중을 훨씬 덜 수 있으니 가독성이 당연하게 올라가겠죠?

 

 

2. 의존성 추가 


dataBinding은 라이브러리이지만 딱히 의존성을 추가할 만한 작업이 크게 필요없습니다. 그냥 단순하게 dataBinding 선언하고 enabled= true만 주시면 됩니다. 아래 코드처럼요!

 

 

3. dataBinding을 이용하는 xml만들기


이렇게만 하면 준비는 끝났습니다. 먼저 main.xml에서 TextView를 하나 만들고 이를 코드에서 어떻게 접근하는지 확인해 보겠습니다.

 

위에서 언급했듯이 객체를 통해 접근할 수 있기 때문에 코드 길이를 줄일 수 있다고 했습니다. 때문에 객체를 통해 바로 접근하기 위해서는 필수적으로 준비해야 하는 것이 있습니다. 

 

첫번 째는 바로 xml코드를 <layout></layout>으로 묶어주는 것입니다. 이렇게 묶어줘야지 dataBinding을 이용할 수 있는 레이아웃임을 인지해서 객체화하고 접근할 수 있습니다.

 

두번 째는 위젯들의 id를 반드시 선언 해 줘야한다는 것입니다. 그래야지 코드에서 만들어진 객체를 가지고서 직접 접근할 수 있습니다. (추가적으로 dataBinding은 카멜표기법을 따르기 때문에 xml상에서 선언한 id와 똑같은 id로 접근하지 않습니다. 이 때문에 카멜표기법으로 변경된 id로 접근해야 xml상에서 선언한 위젯에 접근을 만들 수 있습니다.)

 

 

4. dataBinding을 이용할 수 있는 xml 객체화하기 


위에서 xml을 <layout></layout>으로 전체를 묶었습니다. 이로 인해서 setContent 메서드를 이용하여 객체화 시킬 필요없이, DataBindingUtil 메서드를 통해서 layout을 아래처럼 객체화 시킬 수 있습니다. 

그러니까 activity_main.xml을 카멜표기법으로 ActivityMain으로 변형하고 거기에 Binding을 붙여서 ActivityMainBinding 이렇게 xml을 하나의 클래스처럼 만들어버리기 때문에 다른 자료형을 객체화 하듯, 동일한 방법으로 객체화를 진행 시킬 수 있습니다. 뿐만아니라 activity_main.xml에서 선언했던 TextView도 카멜 표기법에 따라 id를 변형시켜서 직접적으로 접근할 수 있습니다. 

 

 

5. xml 상에서 객체만들기 


dataBinding을 사용하는 대표적인 이유 중 하나가 아닐까합니다. 바로 코드와 xml 둘의 의존성을 낮출 수 있도록 만드는 것입니다. xml은 화면에 보여지는 뷰만 배치하고 선언하는 역할, 코드로 위젯의 이벤트를 처리하는 역할을했기 때문에 둘의 의존성은 매우 높았습니다.

 

하지만 의존성이 높은 코드들은 앱의 질을 떨어트리는 원인 중 하나가 될 정도로 좋지 못한 방법입니다. 때문에 의존성을 낮추기 위해서 코드로 핸들링 할 필요없이 xml 상에서 처리할 수 있는 방안을 모색하게 되었고 결국 xml 상에서 객체를 할당하여 이를 이용하는 방법을 사용할 수 있게 되었습니다.

 

 

xml에 객체를 만들기 위해서 <data></data> 내부에 <variable></variable>을 선언하여 name과 어떤 type인지 정해줍니다. 이렇게 하면 지정한 type에 맞는 객체가 생성되고 xml 상에서 name을 통해서 이 객체에 접근할 수 있습니다. 

 

접근하는 방법은 "@{object name}"을 통해서 위젯들로부터 접근이 가능합니다. 예로 TextView의 Text를 보면 해당 접근을 어떻게 하고 있는지 알 수 있습니다.

 

6. xml상에서 메서드 실행시키기


이번에는 xml 상에서 method에 정의된 것들을 실행시켜보겠습니다.  예를 들어 button 의 클릭리스너를 할당하기 위해서는 코드에서 이벤트 처리를 해줘야했습니다. 하지만 dataBinding에서는 이 클릭리스너에 대한 처리를 xml상에서 해결할 수 있습니다. (물론 method를 선언하고 내용을 작성은 코드에서 하는 것이고 단순히 xml 객체를 통해 불러오면서 사용하는 것입니다!)

 

먼저 main.xml에서 선언된 객체를 MainActivity 자체로 변경해 보겠습니다. 그리고 button을 클릭했을 때 TextView에서 글이 나오도록 만들 것입니다. 이를 위한 Button도 하나 추가해 줬습니다.

 

Button 위젯에서 볼 수 있듯이 onClick은 mainObject 객체에서 만든 setText() 메서드를 실행하도록 만들었습니다. 

이 의미는 button을 클릭했을 때 MainActivity에서 선언한 setText() 메서드가 실행됨을 의미하게 됩니다.  왜냐하면 mainObject의 타입이 MainActivity이기 때문이죠.

 

xml의 설정이 끝났다면 mainActivity에서도 변경해야 할 작업들이 있습니다. 바로 xml에 할당하는 객체값을 변경하는 것도 setText() 메서드를 만드는 것입니다.

 

7. 결과


'android' 카테고리의 다른 글

ViewModel 사용하기  (4) 2020.08.19
Retrofit2 사용해보기  (12) 2020.08.19
Filterable로 자동검색 만들기  (0) 2020.08.17
TabLayout과 viewPager2 연결하기  (0) 2020.08.12
ViewPager2 어댑터 사용 방법  (0) 2020.08.12