개발/Android

ViewBinding / DataBinding

이도일 2022. 1. 12. 13:15

배운 내용 정리를 위해서 기록한다. 

우선 Kotlin / Java 기반 프로젝트들은

1. XML 

2. Source File

로 나뉘어져서 구성되게 되는데, 문제는 이 나눠진 뷰와 소스들을 합쳐주기 위해

binding 작업이라는게 필요하다는 것이다.

 

기본적으로는

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
 
        var txt = findViewById<TextView>(R.id.txt)
        var btn = findViewById<Button>(R.id.btn)
 
        btn.setOnClickListener {
           //click 이벤트
        }
    }

요런식으로 Id값을 찾는 메소드인 findViewById로 찾게 되지만, 뷰바인딩과 데이터바인딩을 사용하면

위 메소드를 사용하지 않아도 가능하다.

우선 이를 사용하기 위해서

 build.gradle에 viewBinding/혹은 dataBinding을 선언해줘야한다

 

buildFeatures

{

    viewBinding = true

}

혹은

 

buildFeatures

{

    dataBinding = true

}

요런식으로!

 

선언까지 끝냈다면 두 코드의 차이점을 살펴보자.

 

뷰바인딩을 사용하면, 기존의 메소드와 달리

private lateinit var binding: ActivityMainBinding
 
override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
		
        binding = ActivityMainBinding.inflate(layoutInflator)
        setContentView(binding.root)
 
        btn.setOnClickListener {
            //click이벤트 추가
        }
    }

이런식으로! 바인딩만 끝내주면 모든 id값을 키워드대로 찾아갈 수 있다

 

반면에 데이터바인딩을 사용하면

private lateinit var binding: ActivityMainBinding
 
override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
		
        binding = DataBindingUtil.setContentView(this, R.layout_main)
        binding.counter = this
        binding.txt.text = number.toString()
 
        btn.setOnClickListener {
          //click이벤트 추가!
        }
    }

이런식으로의 변경이 가능하다.

+ (뷰바인딩과 데이터바인딩 모두 단독으로보단, 뷰모델 / 라이브데이터와 같이 쓰는 경우가 많다.)

 

코드적으로 차이를 대충 확인했으니 명확히 기능적 차이를 짚어보자.

우선 findViewById를 사용할때와 이 둘의 장점은

- id로 찾는것보다 null안정성이 높다는것

이 있겠다. id로 찾다보면 종종 오타가 나서 null오류가 뜰 때가 있는데, 이 둘은 그것을 효과적으로 방지해준다.

 

다음으로, viewBinding만의 차이점은

1. 가볍고 단순한 처리에 적합하다 => 일단 쉽고, 컴파일 속도가 데이터바인딩보다는 빠르다

이 있겠다.

 

그럼 dataBinding은? 

1. 양방향 바인딩을 지원한다(뷰바인딩은 안함)

2. 동적 UI 처리(표현식 사용 등)에 적합하다

3. <layout> 태그를 사용해 뷰를 만든다

 

둘 중에 뭐가 더 낫다. 이렇게 단정짓기보단 때에 따라서 알아서 잘 사용하면 될 것 같다! 개인적으로는 뷰바인딩이 쉬워서 좋지만, 시스템이 유동적이고 복잡해질수록 데이터바인딩이 필요해지는 순간이 올 것 같다.

끝.