[Android] ViewBinding vs DataBinding

๐Ÿ’ก ViewBinding๊ณผ DataBinding์˜ ์ฐจ์ด์™€ ํŠน์ง•์„ ๋น„๊ตํ•˜์—ฌ ์ •๋ฆฌํ•˜์˜€์Šต๋‹ˆ๋‹ค

 

ViewBinding

  • ViewBinding์€ ์•กํ‹ฐ๋น„ํ‹ฐ ๋˜๋Š” ํ”„๋ž˜๊ทธ๋จผํŠธ์—์„œ xml์˜ ๋ทฐ๋ฅผ ์ง์ ‘ ์ฐธ์กฐํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค.
  • ๊ฐ XML ๋ ˆ์ด์•„์›ƒ ํŒŒ์ผ์˜ Binding ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ธ์Šคํ„ด์Šค์—์„œ ๋ ˆ์ด์•„์›ƒ์— ID๊ฐ€ ์žˆ๋Š” ๋ชจ๋“  ๋ทฐ๋ฅผ ์ง์ ‘์ฐธ์กฐ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • findViewById๋ฅผ ์“ฐ์ง€ ์•Š๊ณ  XML์˜ view component์— ์ ‘๊ทผํ•˜๋Š” object๋ฅผ ๋ฐ˜ํ™˜๋ฐ›์•„์„œ view์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŠน์ง•

  • ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” ๋ทฐ ๋ฐ”์ธ๋”ฉ ํด๋ž˜์Šค
    • XML ๋ ˆ์ด์•„์›ƒ๋งˆ๋‹ค ์ž๋™์œผ๋กœ ๋ทฐ ๋ฐ”์ธ๋”ฉ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
    • activity_main.xml → ActivityMainBinding
  • ๊ฐ„๋‹จํ•˜๊ณ  ์•ˆ์ „ํ•œ ํƒ€์ž… ๋ฐ”์ธ๋”ฉ
    • ๋ ˆ์ด์•„์›ƒ์— ์žˆ๋Š” ๋ชจ๋“  ๋ทฐ์— ๋Œ€ํ•ด null-safe, type-safeํ•œ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
    • ์ž˜๋ชป๋œ ๋ทฐ ID๋ฅผ ์ฐธ์กฐํ•˜๊ฑฐ๋‚˜ ์ž˜๋ชป๋œ ํƒ€์ž…์„ ์บ์ŠคํŒ…ํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์˜ค์ง ๋ทฐ ๋ฐ”์ธ๋”ฉ๋งŒ ์ œ๊ณต
    • ๋ ˆ์ด์•„์›ƒ ํŒŒ์ผ์— ์ •์˜๋œ ๋ทฐ์— ๋Œ€ํ•œ ์ง์ ‘์ ์ธ ์ฐธ์กฐ๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ, ๋กœ์ง์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ๋น ๋ฅด๊ณ  ๊ฐ„๋‹จํ•œ ์‚ฌ์šฉ
    • ์ถ”๊ฐ€์ ์ธ ์„ค์ •์—†์ด ๋น ๋ฅด๊ณ  ๊ฐ„๋‹จํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ๋œ ๋ฏธ์นฉ๋‹ˆ๋‹ค.

๋‹จ์ 

  • DataBinding๊ณผ ๋‹ฌ๋ฆฌ ๋ทฐ์™€ ๋ฐ์ดํ„ฐ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๊ธฐ๋ณธ์ ์ธ ๊ธฐ๋Šฅ๋งŒ ์ œ๊ณตํ•˜๋ฉฐ, ํ‘œํ˜„์‹์ด๋‚˜ ๋ณ€์ˆ˜, ์–‘๋ฐฉํ–ฅ ๋ฐ”์ธ๋”ฉ ๊ฐ™์€ ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ๋™์  ๋ทฐ์— ๋Œ€ํ•œ ์ถ”๊ฐ€์™€ ์ œ๊ฑฐ์˜ ์–ด๋ ค์›€
    • ์ •์ ์œผ๋กœ ์ •์˜๋œ ๋ ˆ์ด์•„์›ƒ ํŒŒ์ผ์— ๋Œ€ํ•ด ๋ทฐ๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋™์ ์œผ๋กœ ๋ทฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•˜๋Š” ์ž‘์—…์€ ์ˆ˜๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        binding.textView.text = "Hello, ViewBinding!"
    }
}

DataBinding

  • DataBinding์€ XML์—์„œ ์ง์ ‘ ๋ทฐ์— ๋ฐ์ดํ„ฐ๋ฅผ ํ• ๋‹นํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” Android Jetpack ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๊ตฌ์„ฑ ์š”์†Œ์ž…๋‹ˆ๋‹ค.
  • DataBinding์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด findViewById์™€ ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค ํŠธ๋ฆฌ๋ฅผ ์ฐพ์•„ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์•„์•ผํ•ฉ๋‹ˆ๋‹ค.
    • ์ด๋Š” ํ”„๋กœ๊ทธ๋žจ ๋ฆฌ์†Œ์Šค๋ฅผ ๋งŽ์ด ์žก์•„๋จน๊ณ  ์ฝ”๋“œ ๊ธธ์ด๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๊ธธ์–ด์ง‘๋‹ˆ๋‹ค.
  • UI ์š”์†Œ์™€ ๋ฐ์ดํ„ฐ๋ฅผ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ, ์„ ์–ธ์  ํ˜•์‹์œผ๋กœ ๊ฒฐํ•ฉํ•˜๋„๋ก ๋„์™€์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž…๋‹ˆ๋‹ค.

์„ ์–ธ์  ํ˜•์‹

  • XML์— ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ์—ฐ๊ฒฐํ•ด์„œ ๋„ฃ์–ด์ฃผ๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
<TextView android:text="@{viewmodel.name}" />

ํŠน์ง•

  • ์–‘๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ
    • ๋ฐ์ดํ„ฐ์˜ ๋ณ€ํ™”๊ฐ€ UI์— ์ž๋™์œผ๋กœ ๋ฐ˜์˜๋˜๋ฉฐ, ๋ฐ˜๋Œ€๋กœ UI ๋ณ€ํ™”๋„ ๋ฐ์ดํ„ฐ์— ์ž๋™์œผ๋กœ ๋ฐ˜์˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๋ทฐ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ฐ์ดํ„ฐ ๊ฐ์ฒด์— ๋™๊ธฐํ™”๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • MVVM ํŒจํ„ด๊ณผ์˜ ํ†ตํ•ฉ
    • DataBinding์€ MVVM ์•„ํ‚คํ…์ฒ˜์™€ ์ž˜ ํ†ตํ•ฉ๋ฉ๋‹ˆ๋‹ค.
    • LiveData๋‚˜ ViewModel๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ์™€ ๋ทฐ์˜ ์—ฐ๊ฒฐ์„ ๋”์šฑ ํšจ๊ณผ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • BindingAdapter
    • BindingAdapter๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ •์˜ ๋กœ์ง์„ ๋งŒ๋“ค๊ณ  XML์—์„œ ๋‹ค์–‘ํ•œ ๋ทฐ์— ๋Œ€ํ•ด ๋™์ž‘์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ฝ”๋“œ์™€ XML ๋ถ„๋ฆฌ
    • XML์—์„œ ๋ฐ์ดํ„ฐ ๊ด€๋ จ ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์ฝ”๋“œ์™€ ๋ทฐ ๋กœ์ง์ด ๋ถ„๋ฆฌ๋ฉ๋‹ˆ๋‹ค.
    • ์ด๋ฅผ ํ†ตํ•ด์„œ UI ์—…๋ฐ์ดํŠธ๋ฅผ ์œ„ํ•œ ์ฝ”๋“œ๋ฅผ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ง๊ด€์ ์ธ ํ‘œํ˜„์‹
    • ์ง๊ด€์ ์ธ ํ‘œํ˜„์‹์œผ๋กœ UI์™€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒฐํ•ฉํ•˜๋Š” ๋กœ์ง์„ ๋” ์‰ฝ๊ฒŒ ์ดํ•ดํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

๋‹จ์ 

  • ๋‹จ์ ์—๋Š” ๋ณต์žก์„ฑ๊ณผ ์„ฑ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ฐ„๋‹จํ•œ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ViewBinding์ด ๋” ์ ํ•ฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์„ค์ •๊ณผ ์„œ์šฉ์ด ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋” ๋งŽ์€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์— ์•ฝ๊ฐ„์˜ ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋งค์šฐ ๋ณต์žกํ•œ ๋ฐ”์ธ๋”ฉ์„ ํ•  ๊ฒฝ์šฐ ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ViewBinding vs DataBinding

  • DataBinding์€ XML์—์„œ ๋ทฐ์— ์ง์ ‘ ๋ฐ์ดํ„ฐ๋ฅผ ํ• ๋‹นํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • ๋ทฐ ๋ฐ”์ธ๋”ฉ ๊ธฐ๋Šฅ + ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ๋ทฐ์— ๋ฐ”์ธ๋”ฉ
  • ViewBinding์€ ์•กํ‹ฐ๋น„ํ‹ฐ ๋˜๋Š” ํ”„๋ž˜๊ทธ๋จผํŠธ์—์„œ XML์˜ ๋ทฐ๋ฅผ ์ง์ ‘ ์ฐธ์กฐํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • ์˜ค์ง ์ฝ”๋“œ์— ๋ทฐ๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ
  • ViewBinding์€ ์–‘๋ฐฉํ–ฅ ๋ฐ”์ธ๋”ฉ ๋ฐฉ์‹์ด ์•„๋‹ˆ๋ฉฐ, DataBinding๊ณผ ๊ด€๋ จํ•œ ์˜ค๋ฒ„ํ—ค๋“œ ๋ฐ ์„ฑ๋Šฅ ์ด์Šˆ๋ฅผ ํ”ผํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋นŒ๋“œ์— ์‹œ๊ฐ„์ด ์ ๊ฒŒ ์†Œ์š”๋ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ 

https://velog.io/@jeongminji4490/View-Binding-Data-Binding

https://velog.io/@sh1mj1/Android-Binding-ViewBinding-DataBinding