๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ Client/Android

[Android] Jetpack - Data binding

by Danna 2020. 11. 25.
728x90
728x90
Data binding์€ ๋ ˆ์ด์•„์›ƒ์˜ UI ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์•ฑ์˜ ๋ฐ์ดํ„ฐ์™€ ๊ฒฐํ•ฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.

 

ViewModel ๋กœ๋ถ€ํ„ฐ ์‚ฌ์šฉ์ž ์ด๋ฆ„์„ ์ฐธ์กฐํ•ด ํ…์ŠคํŠธ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ ์ž ํ• ๋•Œ, ๊ธฐ์กด์—๋Š” ์ง์ ‘ ์ž๋ฐ” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด ํ…์ŠคํŠธ๋ฅผ ๋ณ€๊ฒฝํ–ˆ๋‹ค.

tv.text = viewModel.getUserName()

 

Data binding์„ ์‚ฌ์šฉํ•˜๋ฉด ์ž๋ฐ” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ  ๋ ˆ์ด์•„์›ƒ ํŒŒ์ผ์—์„œ ์ง์ ‘ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•ด ํ…์ŠคํŠธ๋ฅผ ๋ณ€๊ฒฝ ํ•  ์ˆ˜ ์žˆ๋‹ค.

<TextView
	android:text="@{viewmodel.userName}" />

 

Data binding์„ ํ†ตํ•ด ๋ณด์ผ๋Ÿฌ ํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ(boilerplate code)๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.

๋”๋ณด๊ธฐ

boilerplate code ?

๋น„์Šทํ•œ ํ˜•ํƒœ์—์„œ ์ตœ์†Œํ•œ์˜ ๋ณ€๊ฒฝ์œผ๋กœ ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ์žฌ์‚ฌ์šฉ๋˜๋Š” ์ฝ”๋“œ๋ฅผ ๋œปํ•œ๋‹ค.

์ค‘๋ณต๋˜์–ด ๋งŽ์€ ์–‘์˜ ์ฝ”๋“œ๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค๊ณ , ๋ฆฌํŒฉํ† ๋ง์‹œ ๋ฒˆ๊ฑฐ๋กœ์›Œ์ง„๋‹ค.

 

Data binding ์„ค์ •ํ•˜๊ธฐ

app ๋ชจ๋“ˆ์˜ build.gradle ์— ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ ํ™œ์„ฑํ™”ํ•˜๊ธฐ

android {
	...
	dataBinding {
		enabled = true
	}
}

๊ตฌ๋ฌธ ๊ฐ•์กฐ, ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ ํ‘œํ˜„์‹ ์˜ค๋ฅ˜ ๊ฒ€์ถœ, XML ์ฝ”๋“œ ์ž๋™ ์™„์„ฑ, ๋น ๋ฅธ ์ฝ”๋“œ ์ฐธ์กฐ ๊ธฐ๋Šฅ์ด ํ™œ์„ฑํ™”๋œ๋‹ค.

 

Binding class ์ƒ์„ฑํ•˜๊ธฐ

xml ๋ ˆ์ด์•„์›ƒ ํŒŒ์ผ์—์„œ ์ตœ์ƒ์œ„ ๋ ˆ์ด์•„์›ƒ์„ <layout> ํƒœ๊ทธ๋กœ ๊ฐ์‹ธ๋ฉด ๋ฐ”์ธ๋”ฉ ํด๋ž˜์Šค๊ฐ€ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋œ๋‹ค.

  • ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด ๋ ˆ์ด์•„์›ƒ์˜ ๋ณ€์ˆ˜์™€ ๋ทฐ๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ด๋•Œ ์ƒ์„ฑ๋˜๋Š” ํด๋ž˜์Šค๋Š” ViewDataBinding ์„ ์ƒ์†๋ฐ›๋Š” ํด๋ž˜์Šค๋‹ค.

์ƒ์„ฑ๋˜๋Š” ๋ฐ”์ธ๋”ฉ ํด๋ž˜์Šค ์ด๋ฆ„์€ xml ๋ ˆ์ด์•„์›ƒ ํŒŒ์ผ๋ช…์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒ์„ฑ๋œ๋‹ค.

  • activity_main.xml ํŒŒ์ผ๋ช…์ธ ๊ฒฝ์šฐ ActivityMainBinding ์ด๋ฆ„์˜ ํด๋ž˜์Šค๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.
  • ๋ ˆ์ด์•„์›ƒ์— ๋Œ€ํ•œ ํ‘œํ˜„์€ ~Binding ํด๋ž˜์Šค๋กœ ์ž‘์„ฑ๋˜์ง€๋งŒ, ์‹ค์ œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๊ตฌํ˜„์‹œ์—๋Š” ~BindingImpl ์„ ์ฐธ์กฐํ•ด์•ผ ํ•œ๋‹ค.

๋ฐ”์ธ๋”ฉ ํด๋ž˜์Šค ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, xml ๋ ˆ์ด์•„์›ƒ ํŒŒ์ผ์˜ <data> ํƒœ๊ทธ ๋‚ด์— class ์†์„ฑ์„ ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค.

 

ํ•ด๋‹น ๊ฒฝ์šฐ์—๋Š” databinding ํŒจํ‚ค์ง€์— ํด๋ž˜์Šค๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.

<data class="ContactItem"> 
	... 
</data>

ํ˜„์žฌ ๋ชจ๋“ˆ ๋‚ด์˜ ํŒจํ‚ค์ง€์— ์ƒ์„ฑํ•˜๊ณ ์‹ถ๋‹ค๋ฉด ํด๋ž˜์Šค๋ช…์•ž์— . ์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

<data class=".ContactItem"> 
	... 
</data>

ํŒจํ‚ค์ง€ ๋ช…์„ ๋‹ค์‹œ ์ง€์ •ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ํŒจํ‚ค์ง€๋ช… ์ „์ฒด์™€ ํด๋ž˜์Šค๋ช…์„ ์ž‘์„ฑํ•œ๋‹ค.

<data class="com.example.ContactItem"> 
	... 
</data>

 

Activity ์—์„œ View binding ํ•˜๊ธฐ.

DataBindingUtil ํด๋ž˜์Šค๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์•กํ‹ฐ๋น„ํ‹ฐ์˜ setContentView ๋ฅผ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋‹ค.

class MainActivity: AppCompatActivity() {

	lateinit var binding : ActivityMainBinding

	override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
	}
}

 

Activity ์™ธ์— Fragment, Adapter, CustomView, ๋ฐ”์ธ๋”ฉ ํด๋ž˜์Šค๋ฅผ ๋ฏธ๋ฆฌ ์•Œ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์— ๋Œ€ํ•ด ์ •๋ฆฌ๋˜์–ด์žˆ๋Š” ์‚ฌ์ดํŠธ์ด๋‹ค.

 

728x90
728x90