안드로이드 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 내용 추가

박상권님이 좋은 의견을 주셔서 내용을 조금 추가합니다.

  1. 단점에서 특정 Activity가 상속돼야할 경우 문제가 될 수 있다고 했는데요, 이런 경우를 위해 애초에 BaseActivity를 쓰지 않고 필요한 것들을 Interface에 정의해눟고 이를 Implements하여 쓴다고 합니다.
  2. BaseActivity를 사용하다보면 내용이 점점 많아져서 Base의 의미를 잃는 경우가 생길 수 있습니다. 그래서 BaseActivity도 아래와 같이 분리해서 쓴다고 합니다.

    BindActivity
      ⌞ MvvmActivity
           ⌞ MainActivity

자세한 내용은 아래 댓글을 참고해주세요!

태그: ,

카테고리:

업데이트:

블로그에 기여하기

댓글남기기