[친절한 JETPACK 개론 <상>] / ViewBinding, DataBinding

hyihyi·2022년 12월 27일
0

Android Jetpack

💁Jetpack이란?

개발자가 관심 있는 코드에 집중할 수 있도록 권장사항 준수, 상용구 코드 축소, 모든 Android 버전 및 기기에서 일관되게 작동하는 코드 작성을 돕는 라이브러리 모음

Room, LiveData, ViewModel

기존에 쓰던 방법

🧸findViewById

val btn1 : Button = findViewById(R.id.btn1)
btn1.text = "abcd"

🙅하지만 버튼을 여러 개 만들 때 번거로움

val btn1 : Button = findViewById(R.id.btn1)
val btn2 : Button = findViewById(R.id.btn2)
val btn3 : Button = findViewById(R.id.btn3)

btn1.text = "abcd"
btn2.text = "abcd"
btn3.text = "abcd"

다른 방법

🧸Kotlin Extensions

gradle 파일에 아래 코드

id 'kotlin-android-extensions'

하지만 이 방법은 구글에서 권장되지 않는 방법

📢 동일한 id를 가진 동일한 widget 사용 주의

null object reference 에러

MainActivity 파일에서 만든 btn1 widget을 SecondActivity에서 호출하면 null object reference 에러가 난다.

일단 동작하니깐 개발자는 아무 문제 없다고 여기고, 코드 리뷰에서도 발견하기 어렵다.

이미 잘 돌아가니 손도 안대고 있다가, 나중에 전혀 다른 곳에서 이슈가 터질 수 있다. 이 화면은 그대로 써야 하는데 공통으로 사용하던 레이아웃 이름을 변경하거나, 그 레이아웃의 widget id 이름을 변경했다거나 한다면 문제가 생길 수 있다. 나와 아무런 관련 없는 코드가 오류가 날 수 있다.

동일한 id를 가진 서로 다른 widget

해당 레이아웃에서만 사용하는 widget만 추천하는 것이 아니라 모든 레이아웃의 widget이 추천됨
이런 경우에는 런타임 오류가 발생

동일한 id를 가진 같은 widget

import와 include를 사용하게 되는 경우 발생할 수 있음
이 경우에는 정상 동작을 함

📢 성능 이슈

RecyclerView에서 사용할 때 이슈가 남

‘kotlin-android-extensions’이 좋은 플러그인은 아니다.
findViewById의 반복적인 작업을 제거하려고 만들어졌고, 내부적인 캐시를 통해 재사용성을 높였을 뿐이다.

내부적인 캐싱을 통해 재사용성을 높였지만 RecyclerView의 ViewHolder에서는 캐싱을 해주지 않는다.

ViewHolder는 재사용성을 높이려고 만들어졌는데, 정작 ViewHolder에서 Kotlin-android-extensions을 사용한다면 캐싱을 해주지 않는다.

[참고]
https://thdev.tech/android/2020/10/07/Remove-kotlinx-synthetic/
https://junyoung-developer.tistory.com/27

🔔그래서 사용하는 방법

1. ViewBinding

(1) Activity

  1. gradle에 아래 코드 추가
buildFeatures {
	viewBinding = true
}
  1. Activity에 코드 추가
    setContentView(R.layout.activity_main) 삭제하기
private lateinit var binding : ActivityMainBinding
binding = ActivityMainBinding.inflate(layoutInflater)
val view = binding.root
setContentView(view)

(2) Fragment

2. DataBinding

ViewBinding이랑 다른 점?
이름처럼 데이터를 연결해주는 역할을 함. 데이터와 같이 결합해서 사용할 수 있음
DataBinding + LiveData
DataBinding은 레이아웃 파일을 맨위에서부터 맨 밑까지 <layout>으로 감싸줘야 함

  • 데이터 결합을 Int 타입으로 쓰면 에러가 남
    Integer.toString(Int타입)

-- 1-4부터 다시 듣자!

profile
자유롭게 쓴 나의 자유로운 Development voyage⛵

0개의 댓글