[Android] Jetpack DataBinding 이란?
Android

[Android] Jetpack DataBinding 이란?

반응형

오늘은 Jetpack의 DataBinding에 대해 알아보겠습니다.

1. DataBinding 이란?

Data 와 View(Xml)를 Binding(연결) 해서 코드를 쉽게 작성할 수 있도록 지원해주는 기능을 제공합니다.

 

2. DataBinding / ViewBinding 비교

  • 공통점
  • View를 직접 참조하는 데 사용할 수 있는 결합 클래스를 생성하며 관리합니다.
  • 차이점
    • 컴파일 속도 : ViewBinding > DataBinding
    • Apk 용량 : ViewBinding < DataBinding
    • ViewBinding은 단지 View 를 참조하여 사용해서 Controller 에서만 사용 가능합니다.
    • DataBinding은 레이아웃 표현식을 지원해서 Xml 파일에서 직접 동적 UI 컨텐츠 선언이 가능합니다.
    • DataBinding은 양방향 바인딩을 지원하지만, ViewBinding은 단방향 바인딩을 지원합니다.
  • 결론
💡 DataBinding 과 ViewBinding 모두 사용하는 것이 가장 좋으며 ViewModel / 레이아웃 표현식 / 양방향 바인딩 등의 기능을 사용할 경우 DataBinding 사용, 단순 Xml Binding 만 필요할 경우에는 ViewBinding 사용이 적절합니다.

 

3. DataBinding / ViewBinding 사용법

  • DataBinding 사용법

https://developer.android.com/topic/libraries/data-binding?hl=ko

 

데이터 결합 라이브러리  |  Android 개발자  |  Android Developers

데이터 결합 라이브러리 Android Jetpack의 구성요소. 데이터 결합 라이브러리는 프로그래매틱 방식이 아니라 선언적 형식으로 레이아웃의 UI 구성요소를 앱의 데이터 소스와 결합할 수 있는 지원

developer.android.com

 

  • ViewBinding 사용법

https://developer.android.com/topic/libraries/view-binding?hl=ko

 

뷰 결합  |  Android 개발자  |  Android Developers

뷰 결합 뷰 결합 기능을 사용하면 뷰와 상호작용하는 코드를 쉽게 작성할 수 있습니다. 모듈에서 사용 설정된 뷰 결합은 모듈에 있는 각 XML 레이아웃 파일의 결합 클래스를 생성합니다. 바인딩

developer.android.com

 

4. 경우에 따라 View 를 Binding 하는 방법

  1. DataBindingUtil 으로 선언하는 방법 (이 방법으로 통일 하겠습니다)
  2. xml 에 Layout 선언 후 자동 생성되는 ViewDataBinding 에 inflate 하는 방법 (ViewGroup 을 상속받는 CustomView 일경우 사용)
  • Activity

DataBindingUtil 의 setContentView 사용

ActivityMainBinding binding;

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
	      binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
}

 

  • Fragment

DataBindingUtil 의 inflate 사용

// Fragment
FragmentMainBinding binding;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    binding = DataBindingUtil.inflate(inflater, R.layout.fragment_main, container, false);
    return binding.getRoot();
}

 

  • Adapter

ViewHolder 를 사용 할 경우를 전제로 DataBindingUtil 의 inflate 사용

// Adapter
class MainAdapter extends RecyclerView.Adapter<MainViewHolder> {

		private LayoutInflater layoutInflater;

		@Override
		public ViewHolder onCreateViewHolder( ViewGroup parent, int viewType ) {
		    if( layoutInflater == null ) {
	        layoutInflater = LayoutInflater.from(parent.getContext());
		    }
        
		    MainItemBinding binding = DataBindingUtil.inflate(layoutInflater, R.layout.main_item, false);
		    return new MainViewHolder(binding);
		}
}

// ViewHolder
class MainViewHolder extends RecyclerView.ViewHolder {
    
		MainItemBinding binding;
    
    public MainViewHolder(MainItemBinding binding) {
    	super(binding.getRoot() );
    	this.binding = binding;
    }
}

 

  • ViewGroup (CustomView 등)

CustomView 는 DataBindingUtil 을 사용하지 않음

public class CustomView extends LinearLayout{
  
		CustomViewBinding binding;
		
		public CustomView(Context context, AttributeSet inAttrs) {
		    super(context, inAttrs);
		    LayoutInflater inflater = LayoutInflater.from(inContext);
		    binding = CustomViewBinding.inflate(inflater, this, true);
	  }
	  ...
}

 

  • 기타 예외 사항
// View 가 null 이 아니고, 재사용 되는 경우
DataBindingUtil.getBinding(view);

// Binding Class 를 모를 경우
LayoutInflater inflater = LayoutInflater.from(this).inflate(layoutId, parent, attachToParent);
ViewDataBinding binding = DataBindingUtil.bind(inflater);

 

반응형