안드로이드 Data Binding(데이터 바인딩) 반복되는 코드 줄이기
Data Binding은 코드를 간결하고 구조 있게 만들어줍니다.
데이터 바인딩을 사용하기 위해 우리는 항상 아래와 같은 코드를 작성합니다.
//MainActivity.kt
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
binding.apply {
//Do something
}
}
}
얼마 안되는 길이의 코드이긴 하지만 이런 Boilerplate 코드가 생기면 좋지 않습니다.
그러면 어떻게 해결하나요?
이미 아시는 분들은 많이 쓰고 있는 방법인데요,
BaseActivity를 만들고 이를 상속해서 쓰는 것입니다.
//BaseActivity.kt
abstract class BaseActivity<T : ViewDataBinding>(@LayoutRes private val layoutResId: Int) : AppCompatActivity() {
protected lateinit var binding: T
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this, layoutResId)
}
}
이런 식으로 만들어두면 데이터 바인딩을 사용하는 Activity에서 아래와 같이 사용할 수 있게 됩니다.
//MainActivity.kt
class MainActivity : BaseActivity<ActivityMainBinding>(R.layout.activity_main) {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding.apply {
//Do something
}
}
}
장점
- 데이터 바인딩뿐만 아니라 Activity들이 공통적으로 수행해야 하는 코드가 있다면 BaseActivity를 이용할 수 있다.
- 따라서 Bolierplate 코드가 줄어든다.
단점
이 링크에 BaseActivity를 사용하는 것에 대해 사람들이 의견을 남겨두었더라고요.
간단하게 요약하자면
- AppCompatActivity가 아니라 특정한 Activity를 상속해야만 하는 경우가 있다.
=> 어쩔 수 없이 BaseActivity를 쓰지 못한다. - BaseActivity가 변경되면 이를 상속한 모든 Activity들이 변경되는 것이므로 부담이 크다. (Side Effect)
- 공동작업을 할 때 다른 사람이 코드를 이해하기 어렵다.
결론
어떻게 보면 단점이 많아 보이지만 적절하게 사용하면 그만큼의 장점이 있으니 잘 판단해서 사용하시면 되겠습니다. 😄
2020.01.22 내용 추가
박상권님이 좋은 의견을 주셔서 내용을 조금 추가합니다.
- 위 단점에서 특정 Activity가 상속돼야할 경우 문제가 될 수 있다고 했는데요, 이런 경우를 위해 애초에 BaseActivity를 쓰지 않고 필요한 것들을 Interface에 정의해눟고 이를 Implements하여 쓴다고 합니다.
- BaseActivity를 사용하다보면 내용이 점점 많아져서 Base의 의미를 잃는 경우가 생길 수 있습니다. 그래서 BaseActivity도 아래와 같이 분리해서 쓴다고 합니다.
BindActivity
⌞ MvvmActivity
⌞ MainActivity
자세한 내용은 아래 댓글을 참고해주세요!
Leave a comment