일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- rxjava cold observable
- 안드로이드 라이선스 종류
- 플러터 설치 2022
- 클래스
- ar vr 차이
- 스택 자바 코드
- 2022 플러터 안드로이드 스튜디오
- rxjava disposable
- 스택 큐 차이
- 안드로이드 os 구조
- 안드로이드 라이선스
- Rxjava Observable
- 2022 플러터 설치
- 안드로이드 유닛테스트란
- 안드로이드 유닛 테스트
- 자바 다형성
- 멤버변수
- android ar 개발
- ANR이란
- jvm이란
- jvm 작동 원리
- 서비스 쓰레드 차이
- 안드로이드 유닛 테스트 예시
- rxjava hot observable
- android retrofit login
- 안드로이드 레트로핏 사용법
- 객체
- 안드로이드 레트로핏 crud
- 큐 자바 코드
- 서비스 vs 쓰레드
- Today
- Total
나만을 위한 블로그
Data Binding(데이터 바인딩)이란? 제트팩(Jetpack) 라이브러리란? 본문
안드로이드 개발 공부를 하면서 언젠진 기억이 안 나지만 데이터 바인딩이란 단어를 어쩌다 한 번 본 적이 있다.
그 땐 막 공부를 시작했던 때라 넘겼지만 요즘 MVVM 디자인 패턴을 공부하다 보니 데이터 바인딩이 툭하면 튀어나와서 이걸 모르면 MVP 패턴을 잘 이해하지 못할 듯 하여 정리 겸 기록하게 됐다.
먼저 데이터 바인딩은 데이터와 바인딩이란 2개 단어로 묶여 있다. 각 단어의 사전적 정의는 아래와 같다.
data : (증명·판단·결정 등을 위한) 자료[정보/데이터], (컴퓨터에 저장된) 자료[데이터/정보]
binding : 법적 구속력이 있는, (제본용) 표지
bind : 묶다, (붕대 등으로) 감싸다[싸다]
데이터를 어떤 것에 묶거나 어떤 것으로 감싼다는 뉘앙스의 단어 같다.
한글 위키백과에선 데이터 바인딩을 아래와 같이 설명하고 있다. 한글이나 영문이나 설명하는 문장이 똑같기 때문에 한글 위키백과 내용을 가져왔다.
데이터 바인딩은 제공자와 소비자로부터 데이터 원본을 결합시켜 이것들을 동기화하는 기법이다. XML 데이터 바인딩과 UI 데이터 바인딩에서처럼 각기 다른 언어의 2개의 데이터/정보 원본을 가지고 수행되는 것이 보통이다. UI 데이터 바인딩의 경우 동일 언어의, 그러나 논리 함수가 다른 데이터와 정보 객체가 하나로 묶인다.(예: 자바 UI 요소를 자바 객체와 묶는 것)
데이터 바인딩 프로세스에서 각 데이터 변화는 데이터에 묶인 요소에 의해 자동으로 반영된다. 데이터 바인딩이라는 용어는 또한 요소 내 데이터의 외부 표현이 변경되는 경우에도 사용되며 기반이 되는 데이터는 자동으로 이러한 변경을 반영하도록 업데이트된다. 한 예로 TextBox 요소에 변화가 생기면 기반이 되는 데이터 값을 수정하게 된다.
다른 언어 2개의 데이터/정보 원본을 결합시켜 동기화하는 기법이란 말 같다. 무슨 소린지 알 것 같은데 정확하게는 모르겠다.
아래는 돌아다니다가 찾은 내용이다.
(중략)...Android의 데이터 바인딩은 전체 MVVM 패턴을 구현하기 위해 약한 참조를 통해 ViewModel과 View를 동기화하는 기능이다...(중략)
데이터 바인딩은 MVVM 패턴을 위한 기능이라고 한다. 아직 데이터 바인딩을 확실히 모르니 그냥 지나가던 사람이 낸 의견이라고 생각하자.
안드로이드 스튜디오에서 확인해보니 제트팩(Jetpack) 라이브러리에 포함된 요소라고 한다. 그럼 제트팩 라이브러리는 또 뭔가? 제트팩이란 단어도 사전적 정의가 있는지 찾아봤다.
Jetpack : 제트팩 (등에 메는 개인용 분사 추진기, 우주 유영 등에 사용)
그냥 SF 영화같은 곳에서 등에 멘 소형 로켓을 말하는 것 같다. 이걸 통해서 하늘을 난다던가 하는 걸 봤는데 그것의 이름이 제트팩인 듯 하다.
실제로 안드로이드 스튜디오 디벨로퍼의 데이터 바인딩 설명 페이지를 보면, 안드로이드 마스코트가 등 뒤에 로켓을 매고 있는 아이콘을 볼 수 있다.
아무튼 데이터 바인딩 자체는 제트팩 라이브러리에 포함된 요소 같으니, 데이터 바인딩을 확인하기 전에 제트팩 라이브러리가 무엇인지부터 확인해보자.
제트팩 라이브러리는 2018 구글 I/O에서 처음 발표된 것으로, 현재 플레이 스토어의 앱 중 99% 정도의 앱이 제트팩 라이브러리를 사용한다고 한다. 그냥 안드로이드 앱들은 다 사용한다고 보면 될 듯 하다.
안드로이드 스튜디오 디벨로퍼에선 제트팩 라이브러리에 대해 아래와 같이 말하고 있다. 두 문단은 각각 다른 곳에서 가져온 텍스트다.
developer.android.com/jetpack/getting-started
Jetpack은 권장 사항을 통합하고 Android 앱에서 이전 버전과의 호환성을 제공하는 Android 라이브러리 모음을 포함합니다. 앱 아키텍처에 대한 Jetpack 가이드는 Android 앱을 빌드 할 때 고려해야 할 권장 사항 및 권장 아키텍처에 대한 개요를 제공합니다.
Jetpack은 개발자가 권장 사항을 따르고, 상용구 코드를 줄이며, Android 버전과 기기에서 일관되게 작동하는 코드를 작성하여 개발자가 관심있는 코드에 집중할 수 있도록 도와주는 라이브러리 모음입니다.
그리고 아래는 안드로이드 프레임워크 팀의 Alan Viverette가 말한 내용이다.
Jetpack is a larger-scoped effort to improve developer experience, but AndroidX forms the technical foundation. From a technical perspective, it's still the same libraries you'd have seen under Support Library and Architecture Components. As best practices change, you may also see libraries in the androidx.* package that are not included in Jetpack.
Jetpack은 개발자 환경을 개선하기 위한 광범위한 노력이지만 AndroidX는 기술 기반을 형성합니다. 기술적인 관점에서 보면 지원 라이브러리 및 아키텍처 구성 요소에서 본 것과 동일한 라이브러리입니다. 모범 사례가 변경되면 Jetpack에 포함되지 않은 androidx.* 패키지의 라이브러리도 볼 수 있습니다.
위에서 말한 내용들과 비슷하다. 개발자 환경을 개선하기 위한 노력의 하나가 제트팩 라이브러리란 것이다. 확실히 자주 쓰이는 코드량을 줄여주고 다양한 안드로이드 버전 및 기기에서 똑같이 작동된다면, 개발자 입장에선 편하긴 할 것이다.
아래는 안드로이드 디벨로퍼 블로그에서 말하는 제트팩 라이브러리의 정의다.
Android Jetpack is a set of components, tools and guidance to make great Android apps. The Android Jetpack components bring together the existing Support Library and Architecture Components and arranges them into four categories
Android Jetpack은 훌륭한 Android 앱을 만들기위한 구성 요소, 도구 및 지침의 모음입니다. Android Jetpack 구성 요소는 기존 지원 라이브러리와 아키텍처 구성 요소를 결합하여 4가지 카테고리로 정렬합니다.
위에서 말한 4가지 카테고리는 가운데 원에 써진 Architecture, UI, Behavior, Foundation이다. 카테고리보다는 구성요소가 좀 더 맞는 뉘앙스같다.
왼쪽 최상단을 보면 데이터 바인딩이 아키텍처에 포함돼 있는 걸 볼 수 있다.
정리하면 제트팩 라이브러리는 자주 쓰이는 코드를 줄이고 여러 안드로이드 버전과 핸드폰에서 작동할 수 있게 도와주는 라이브러리의 모음이다. 그리고 제트팩은 Architecture, UI, Behavior, Foundation의 4가지 구성요소로 이뤄져 있다.
그럼 이제 데이터 바인딩을 보자. 데이터 바인딩은 뭘까?
보통 xml 파일에 뷰를 배치하고 자바 파일에서 이 뷰를 찾으려면 findViewById()를 사용해 참조객체에 매핑한 다음, 이 객체를 통해 여러 메서드를 호출해 데이터를 뷰에 세팅한다.
데이터 바인딩은 이 방식이 아닌 xml에서 특정 구문을 사용해 뷰에 값을 할당하는 방법이다. 아래 예시는 텍스트뷰에 모델 클래스의 변수값을 세팅하는 예시다.
<TextView
android:text="@{viewmodel.userName}" />
아래는 findViewById()를 사용할 때의 예시다.
TextView textView = findViewById(R.id.sample_text);
textView.setText(viewModel.getUserName());
텍스트뷰 태그 안에 @{}를 써서 어떤 데이터를 텍스트뷰에 할당할지를 정의하는 걸 볼 수 있다. 이것을 선언적 형식이라고 한다.
그럼 이 방식의 장점은 뭘까?
- xml 파일에서 뷰에 어떤 데이터가 들어갈지를 선언하기 때문에 자바 파일에서 findViewById()를 호출할 일이 줄어든다. 이로 인해 파일 내용이 단순해지고, 유지관리가 쉬워진다.
여기서 궁금한 것이, 이 장점 하나 때문에 데이터 바인딩을 쓰는 걸까?
물론 큰 사이즈의 복잡한 프로젝트라면 데이터 바인딩이 가져오는 효과는 무시할 수 없을지도 모른다. 하지만 저 장점 하나 때문에 데이터 바인딩을 쓴다고? 라고 생각한다면 납득이 가지 않아서 장단점 및 해결책을 찾아봤다.
- 장점
- 데이터 바인딩은 코드의 데이터 값에 따라 UI를 업데이트(≒동기화)하므로, 사용자에게 표시하려는 데이터가 있고 UI가 아닌 쓰레드에서 업데이트되는 경우 데이터 바인딩을 쓸 가치가 있다. 이 경우 데이터가 업데이트될 때 UI 업데이트 메서드(notifyDataSetChanged() 등)가 호출되지 않기 때문에 버그를 줄일 수 있다.
여기서 잠깐, 위에서 데이터 바인딩은 MVVM 패턴을 구현하기 위해 약한 참조를 통해 ViewModel과 View를 동기화하는 기능이라고 써뒀다.
여기서 뷰모델과 뷰의 동기화는 코드의 데이터 값에 따라 UI를 업데이트한다는 말과 일치한다는 걸 알 수 있다.
- 단점
- 상관없는 오류까지 보여준다 : 컴파일러가 Dagger2, Room 또는 Realm 따위의 문제에 대해 프로젝트를 컴파일할 수 없는 경우 관련없는 오류를 표시해서, 컴파일러가 데이터 바인딩 관련 클래스를 생성할 수 없으므로, 데이터 바인딩과 상관없는 오류까지 보여줄 가능성이 있다 -> R8 컴파일러가 이 단점을 해결해준다고 하지만 확실하진 않다
- 데이터 바인딩을 써서 데이터 변경 후 뷰를 업데이트하면 화면이 깜빡일 수 있다
- 패키지명의 자동 이름 변경이 xml 파일에서 작동하지 않을 수 있다
- 자동 생성된 .class 파일 때문에 앱 크기가 커질 수 있다
- 해결책
- 데이터 바인딩을 쓰되 이벤트는 사용하지 않는다
- ButterKnife를 사용한다
- 그냥 findViewById()를 쓴다
- 코틀린을 쓴다
참고 링크)
사용법을 확인하고 싶다면 아래 티스토리 참고. 작성자분이 예시를 정말 잘 써놓으셔서 개인적으로 이것부터 안드로이드 데이터 바인딩 공부를 시작하는 것도 나쁘진 않을 것 같다.
www.cleveroad.com/blog/effective-power-of-android-data-binding
medium.com/@hanihashemi/data-binding-pros-and-cons-choose-wisely-11dc5f0d310c
stackoverflow.com/questions/41462365/what-are-the-pros-and-cons-of-android-data-binding
'개인 공부' 카테고리의 다른 글
Node.js란? (0) | 2021.01.25 |
---|---|
[Android] Rxjava란? (0) | 2021.01.23 |
NoSQL이란? SQL이란? 둘의 차이는 무엇인가? (0) | 2020.12.03 |
HTTP와 HTTPS의 차이란? (0) | 2020.11.18 |
프레임워크와 라이브러리의 차이점 (0) | 2020.11.14 |