[Android] 뷰 바인딩(view binding)이 뭘까?

최민재·2022년 6월 1일
1
post-thumbnail

들어가며 👊

처음 안드로이드를 공부할 때

TextView tvName = findViewById(R.id.tv_name);
tvName.setText("snack");

뭐 이런 코드를 작성하며 텍스트 뷰의 텍스트가
코딩한 그대로 앱에 나타나는 것을 보고 참 신기하다고 생각하던 때가 있었습니다.
하지만 시간이 지나고 조금식 규모있는 프로젝트를 시작하여 문제를 하나 느꼈죠..

흠.. 이거 코드에 findViewById()만 남겠는데..?

뭐 그만큼 findViewById()가 많이 사용되는 것이죠!
관리해야할 버튼이 20개만 되어도 벌써 어질 어질..

그래서 findViewById()를 대신할 뷰 바인딩(view binding)에 대해서 정리해 보겠습니다!

뷰 바인딩이 뭘까? 🧐

View Binding은 안드로이드 아키텍쳐 구성요소 중 하나로
뷰와 상호작용 하는 코드를 쉽게 작성할 수 있게 해줍니다.

xml과 연결되는 바인딩 클래스가 자동으로 생성되며
그 클래스의 멤버로 xml의 ID를 가진 모든 뷰를 참조하는
참조 변수가 있습니다!

여기서 바인딩 클래스는 정해진 명명 규칙에 따라서 만들어집니다.
예를 들어
activity_main.xml -> ActivityMainBinding
fragment_home.xml -> FragmentHomeBinding
recycler_item.xml -> RecyclerItemBinding

왜 사용할까?? 👏

기존 findViewById에는 몇가지 문제점이 존재합니다.

  1. 위에서 적었듯이 코드가 더러워집니다..
  2. 실수로 없는 id를 사용하면 NULL 오류가 발생합니다.
  3. 실수로 뷰의 타입을 잘못 적으면 오류가 발생합니다.
    ex. TextView -> ImageView

하지만 뷰 바인딩을 사용하면 이런 문제들이 해결되죠!

다른 것들도 있다고 들었는데.. 🤕

예전 개발자들은 findViewById를 사용하였습니다.
그때는 Butter knife 같은 라이브러리를 사용하여 불편을 해결하였습니다.

하지만 Butter knife는 안드로이드 고유의 기능이 아니었고
항상 문제 없이 안전하게 사용하기에는 무리가 있었습니다.
그리고 어노테이션 작업도 귀찮았습니다.

그리고 코틀린에는 id를 바로 변수처럼 사용할 수 있는
Kotlin-Synthetic이 있었습니다.
하지만 지금은 deprecated 되었죠..

뭐 결국은 지금 java, kotlin 전부
view binding을 사용하게 되었습니다.

뷰 바인딩 사용하기! 🔥

일단 앱 단위의 build.gradle에 들어갑니다.

android {
	...
    buildFeatures {
        viewBinding true
    }
}

위와 같이 적어줍니다.
그리고 sync를 눌러줍니다.

Activity

뷰 바인딩을 적용하실 Activity로 간 후
아래와 같이 코드를 작성합니다.

private ActivityMainBinding binding;

@Override
protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	binding = ActivityMainBinding.inflate(getLayoutInflater());
	setContentView(binding.getRoot());
}

위와 같이 코드를 적었다면
아래와 같이 바인딩 클래스 인스턴스를 사용하여 뷰를 참조할 수 있습니다.

binding.tvDate.setText("2022-06-01");

Fragment

fragment도 비슷합니다.

private FragmentMealBinding binding;

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

@Override
public void onDestroyView() {
	super.onDestroyView();
	binding = null;
}

위와 같이 작성하시면 뷰 바인딩을 사용하실 수 있습니다.
사용법은 위의 Activity와 똑같이 사용하실 수 있습니다.

binding.tvInit.setText("Hello");

Data Binding과의 차이? 💪

저는 요즘 Data Binding을 사용하기에 마지막으로
Data BindingView Binding의 차이를 작성하며 끝내겠습니다.

1. View Binding은 컴파일 시간이 더욱 짧습니다.
2. View Binding은 xml 파일에 특별히 태그를 하지 않아도 되므로
더욱 신속하고 간편하게 사용할 수 있습니다.

마치며 ☕️

뷰 바인딩, 데이터 바인딩
어느것이 더 좋다를 판별하기 보다는 자신의 상황에 맞추어서
어느것이 더 도움이 될까 생각하는 것이 더욱 코딩을 함에 있어서
좋은 코드를 짤 수 있을 것이라고 생각합니다!

profile
Android Engineer

0개의 댓글