과거: Butter Knife 사용법 (Java)
Butter Knife는 어노테이션(@BindView, @OnClick)을 사용하여 findViewById와 setOnClickListener를 대체했습니다.
1. build.gradle 설정
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<span class="line"><span>// build.gradle (Module: app)</span></span> <span class="line"><span></span></span> <span class="line"><span>// Java에서 어노테이션 프로세서를 사용하기 위해 필요</span></span> <span class="line"><span>apply plugin: 'com.android.application'</span></span> <span class="line"><span>apply plugin: 'kotlin-android' // 예시를 위해 추가, Java만 사용시 불필요</span></span> <span class="line"><span>apply plugin: 'com.jakewharton.butterknife'</span></span> <span class="line"><span></span></span> <span class="line"><span>android { ... }</span></span> <span class="line"><span></span></span> <span class="line"><span>dependencies {</span></span> <span class="line"><span> implementation 'com.jakewharton:butterknife:10.2.3'</span></span> <span class="line"><span> annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.3'</span></span> <span class="line"><span>}</span></span></code><code class="whitespace-pre-wrap break-words"><span class="line"><span></span></span> |
2. MainActivity.java 예시
activity_main.xml에 아래와 같은 뷰가 있다고 가정합니다.
TextView(id:textView_title)Button(id:button_submit)1
123456789101112131415161718192021222324252627282930313233343536373839<span class="line"><span>// MainActivity.java</span></span><span class="line"></span><span class="line"><span>import</span><span> android.os.Bundle;</span></span><span class="line"><span>import</span><span> android.widget.Button;</span></span><span class="line"><span>import</span><span> android.widget.TextView;</span></span><span class="line"><span>import</span><span> android.widget.Toast;</span></span><span class="line"><span>import</span><span> androidx.appcompat.app.AppCompatActivity;</span></span><span class="line"></span><span class="line"><span>import</span><span> butterknife.BindView;</span></span><span class="line"><span>import</span><span> butterknife.ButterKnife;</span></span><span class="line"><span>import</span><span> butterknife.OnClick;</span></span><span class="line"></span><span class="line"><span>public</span><span> class</span><span> MainActivity</span><span> extends</span><span> AppCompatActivity</span><span> {</span></span><span class="line"></span><span class="line"><span> // 1. @BindView 어노테이션으로 뷰를 필드에 바인딩</span></span><span class="line"><span> @</span><span>BindView</span><span>(R.id.textView_title)</span></span><span class="line"><span> TextView titleTextView;</span></span><span class="line"></span><span class="line"><span> @</span><span>BindView</span><span>(R.id.button_submit)</span></span><span class="line"><span> Button submitButton;</span></span><span class="line"></span><span class="line"><span> @</span><span>Override</span></span><span class="line"><span> protected</span><span> void</span><span> onCreate</span><span>(Bundle </span><span>savedInstanceState</span><span>) {</span></span><span class="line"><span> super</span><span>.</span><span>onCreate</span><span>(savedInstanceState);</span></span><span class="line"><span> setContentView</span><span>(R.layout.activity_main);</span></span><span class="line"></span><span class="line"><span> // 2. ButterKnife.bind(this)를 호출하여 실제 바인딩을 수행</span></span><span class="line"><span> ButterKnife.</span><span>bind</span><span>(</span><span>this</span><span>);</span></span><span class="line"></span><span class="line"><span> // 이제 findViewById 없이 바로 뷰를 사용할 수 있음</span></span><span class="line"><span> titleTextView.</span><span>setText</span><span>(</span><span>"Hello Butter Knife!"</span><span>);</span></span><span class="line"><span> }</span></span><span class="line"></span><span class="line"><span> // 3. @OnClick 어노테이션으로 클릭 리스너를 메서드에 바인딩</span></span><span class="line"><span> @</span><span>OnClick</span><span>(R.id.button_submit)</span></span><span class="line"><span> public</span><span> void</span><span> onSubmitButtonClick</span><span>() {</span></span><span class="line"><span> Toast.</span><span>makeText</span><span>(</span><span>this</span><span>, </span><span>"Submit Button Clicked!"</span><span>, Toast.LENGTH_SHORT).</span><span>show</span><span>();</span></span><span class="line"><span> }</span></span><span class="line"><span>}</span></span></code><code class="whitespace-pre-wrap break-words"><span class="line"><span></span></span>
Butter Knife의 문제점 (Java 관점):
R.id.non_existent_id처럼 존재하지 않는 ID를 실수로 적어도 컴파일 시에는 에러가 발생하지 않고, 앱 실행 중에 크래시가 발생합니다. (런타임 에러)- 어노테이션 프로세싱 때문에 프로젝트가 커질수록 빌드 속도가 느려집니다.
현재: View Binding 사용법 (Java) – 공식 권장 방식
View Binding은 별도의 라이브러리 추가 없이 build.gradle 파일의 설정 하나만으로 사용할 수 있으며, 컴파일 타임에 안전한 코드를 생성해 줍니다.
1. build.gradle 설정
|
1 2 3 4 5 6 7 8 9 10 11 |
<span class="line"><span>// build.gradle (Module: app)</span></span> <span class="line"><span></span></span> <span class="line"><span>android {</span></span> <span class="line"><span> ...</span></span> <span class="line"><span> // buildFeatures 블록 안에 viewBinding을 true로 설정</span></span> <span class="line"><span> buildFeatures {</span></span> <span class="line"><span> viewBinding true</span></span> <span class="line"><span> }</span></span> <span class="line"><span>}</span></span> <span class="line"><span></span></span> <span class="line"><span>// Butter Knife 관련 의존성은 모두 제거합니다.</span></span></code><code class="whitespace-pre-wrap break-words"><span class="line"><span></span></span> |
이 설정 하나면 준비는 끝입니다. 별도의 dependencies 추가가 필요 없습니다.
2. MainActivity.java 예시
Gradle이 activity_main.xml 레이아웃 파일을 기반으로 ActivityMainBinding이라는 클래스를 자동으로 생성해 줍니다.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
<span class="line"><span>// MainActivity.java</span></span> <span class="line"></span> <span class="line"><span>import</span><span> android.os.Bundle;</span></span> <span class="line"><span>import</span><span> android.view.View;</span></span> <span class="line"><span>import</span><span> android.widget.Toast;</span></span> <span class="line"><span>import</span><span> androidx.appcompat.app.AppCompatActivity;</span></span> <span class="line"></span> <span class="line"><span>// 1. 자동으로 생성된 바인딩 클래스를 import</span></span> <span class="line"><span>import</span><span> com.your.</span><span>package</span><span>.name.databinding.ActivityMainBinding;</span></span> <span class="line"></span> <span class="line"><span>public</span><span> class</span><span> MainActivity</span><span> extends</span><span> AppCompatActivity</span><span> {</span></span> <span class="line"></span> <span class="line"><span> // 2. 바인딩 클래스 타입의 변수를 선언</span></span> <span class="line"><span> private</span><span> ActivityMainBinding binding;</span></span> <span class="line"></span> <span class="line"><span> @</span><span>Override</span></span> <span class="line"><span> protected</span><span> void</span><span> onCreate</span><span>(Bundle </span><span>savedInstanceState</span><span>) {</span></span> <span class="line"><span> super</span><span>.</span><span>onCreate</span><span>(savedInstanceState);</span></span> <span class="line"></span> <span class="line"><span> // 3. 바인딩 객체를 초기화하고 레이아웃을 설정</span></span> <span class="line"><span> binding </span><span>=</span><span> ActivityMainBinding.</span><span>inflate</span><span>(</span><span>getLayoutInflater</span><span>());</span></span> <span class="line"><span> View view </span><span>=</span><span> binding.</span><span>getRoot</span><span>();</span></span> <span class="line"><span> setContentView</span><span>(view);</span></span> <span class="line"></span> <span class="line"><span> // 4. 이제 'binding' 객체를 통해 ID로 뷰에 안전하게 접근 가능</span></span> <span class="line"><span> // XML의 ID가 camelCase 형태의 프로퍼티로 변환됨 (textView_title -> textViewTitle)</span></span> <span class="line"><span> binding.textViewTitle.</span><span>setText</span><span>(</span><span>"Hello View Binding!"</span><span>);</span></span> <span class="line"></span> <span class="line"><span> // 5. 클릭 리스너는 전통적인 방식으로 설정</span></span> <span class="line"><span> binding.buttonSubmit.</span><span>setOnClickListener</span><span>(</span><span>new</span><span> View.</span><span>OnClickListener</span><span>() {</span></span> <span class="line"><span> @</span><span>Override</span></span> <span class="line"><span> public</span><span> void</span><span> onClick</span><span>(View v) {</span></span> <span class="line"><span> Toast.</span><span>makeText</span><span>(MainActivity.this, </span><span>"Submit Button Clicked!"</span><span>, Toast.LENGTH_SHORT).</span><span>show</span><span>();</span></span> <span class="line"><span> }</span></span> <span class="line"><span> });</span></span> <span class="line"><span> </span></span> <span class="line"><span> // Java 8 람다식을 사용하면 더 간결해짐</span></span> <span class="line"><span> // binding.buttonSubmit.setOnClickListener(v -> {</span></span> <span class="line"><span> // Toast.makeText(MainActivity.this, "Submit Button Clicked!", Toast.LENGTH_SHORT).show();</span></span> <span class="line"><span> // });</span></span> <span class="line"><span> }</span></span> <span class="line"><span>}</span></span></code><code class="whitespace-pre-wrap break-words"><span class="line"><span></span></span> |
View Binding의 장점 (Java 관점):
- 컴파일 타임 안전성: 만약
binding.nonExistentId처럼 존재하지 않는 ID를 사용하려고 하면, 컴파일 시점에 바로 에러가 발생하여 실수를 즉시 수정할 수 있습니다. - 타입 안전성:
binding.textViewTitle은TextView타입임이 보장됩니다. 다른 타입으로 캐스팅할 필요도, 실수할 위험도 없습니다. - 성능: 어노테이션 프로세싱을 사용하지 않아 빌드 속도가 더 빠릅니다.
- 간결함:
ButterKnife.bind(this)같은 초기화 코드가 필요 없고,@BindView,@OnClick어노테이션이 사라져 코드가 더 깔끔해집니다.
결론
Java 환경에서도 Butter Knife가 제공하던 편리함은 이제 View Binding을 통해 더 안전하고 효율적인 방식으로 완벽하게 대체되었습니다.
새로운 안드로이드 프로젝트를 Java로 시작하시거나 기존 프로젝트를 유지보수하신다면, 더 이상 고민하지 마시고 **View Binding을 사용하시는 것이 표준적인 모범 사례(Best Practice)**입니다.