티스토리 뷰

반응형

https://www.youtube.com/watch?v=DAmMN7m3wLU

data binding을 적용하려고 하는데 제대로 알고 적용하고 싶어서 구글링하는 중에 Google I/O 영상을 찾았다.

40분 가량의 영상이고 ... 나를 위해 정리해본다 ! 

 


Data Binding 은 layout 으로부터 data를 호출하지 않게 해준다.

layout의 data를 호출하기 위해 매번 findViewById 를 이용하는 짓(? 영상에서는 이 짓이 suck이라고 표현함...ㅎㅎ)을 하지 않아도 된다.

그렇기 때문에 관심사 분리를 위한 MVVM 패턴 등의 적용된 앱에서 data binding을 사용하면 명확하게 관심사 분리가 가능해진다.

 

> 컴파일 과정에서의 Data Binding 처리 과정

[ Google I/O 영상 화면 캡처 - Data Binding의 컴파일 과정 ]

- Process Layout Files : application을 컴파일하는 과정에서 각종 resource 파일들을 병합한다. 이 과정에서 layout의 data binding 되어 있는 부분은 제거된다.

- Parse Expressions :  data binding을 위한 Expression들의 문법을 검증한다. ID 와 Field 들을 검증하면서 적합하지 않을 경우, Exception을 떨군다. 

- Java Compilation : compile을 통해 얻은 application code ( java code ... )에서 layout 이나 그 외의 파일에서 얻은 어노테이션이 의미하는 바를 확인한다.

- Resolve Dependencies : 표현식의 내용이 변수인지 메소드인지 파악하고, 타입이 무엇인지 파악하면서 문법적으로 문제가 없는지 확인한다. 

- Find Setters : 이렇게 검증을 마친 method를 호출하기 위해서 setter해야 하는 것이 무엇인지 확인한다.

- WriteView Binders : 이러한 과정을 통해 UI 를 업데이트 하기 위한 코드에 결합되어 컴파일이 이뤄진다.

 

 

> Two Way Data Binding

Two Way Data Binding이 가능하다. UI를 업데이트하기도 하고, 반대로 UI의 내용을 data model로 전달할 수 있다.

Two Way Data Binding 의 표현식 : @={ v.data }

 

-How is it Notified?

InverseBindingListener를 통해 변경상태를 확인하고 적용.

어댑터(TextViewBindingAdapter)를 이용해서 데이터를 가져오고, 변경사항이 있을 시, 적용(nameUser.set)함.

- Getting the View's Value

- Notifying

> Expression Chaining (No-code binding)

<-  기존의 표현식

반복적인 코드 작성의 문제 

 

 

 

 

 

 

<- 새로운 표현식

 tag에 id를 설정하면, 해당 id를 사용하여 값을 가져올 수 있음

 

 

 

 

 

 

> Lambda Expression (No-code binding)

이전까지는 layout의 data를 data model에 전달하기 위해서는 id를 설정하고 java 코드에서 해당아이디를 통해, click listener 를 호출해야 했다.

이를 Method Reference, Lambda Expression 을 통해 id할 필요 없이 layout에서 작성이 가능하다. 

- Method Reference 

 

 

<- android:onClick 속성에서 선택 시 동작할 작업을 입력

( 여기서는 Presenter 클래스의 onClick 메소드를 실행시킬 것이라고 정의 함 )

 

 

 

 

<- Presenter 코드에서는 onClick 메소드 내의 동작 과정을 작성

( data 태그 내의 variable에 작성된 Item 을 가져와서 저장함 )

 

 

 

 

 

 

 

그런데 !! Method Reference에는 여전히 불필요한 코드가 존재한다. 

따라서 Lambda Expressions 을 소개한다.

 

- Lambda Expressions

MVVM 과 같은 패턴에 Lambda Expressions를 적용하면 명확히 관심사 분리가 되면서 Presenter부분에는 android code가 존재하지 않게 된다. 그렇기 때문에 테스트가 용이해진다. ( click 시 바로 Presenter의 save 작업 수행 )

<- Presenter의 save 메소드를 이용해 item을 data model에 제공한다는 것을 android:onClick 속성에 정의

 

 

 

 

 

 

 

 

 

<- Presenter 클래스 내에는 안드로이드 코드는 포함되어 있지 않고, 동작을 수행할 작업만 작성되어 있음

 

 

 

 

 

 

 

※ 단, Lambda Expression으로 파라미터 전달 시, onClickListener, onFocusChangeListener 등의 내부 메소드의 파라미터를 전부 작성해주던가 아예 작성하지 않아야 한다.(영상 : 18분 쯤...)

※ Layout 파일의 Lambda Expression은 컴파일 과정에서 제거되기 때문에 Lambda Expression으로 처리한 메소드의 반환 값을 통해 다른 업무를 수행하는 것은 불가능하다.(영상 : 18분 쯤...)

 

- Method Reference, Lambda Expression 비교 

Lambda Expression : null 처리 불가능 (하지만... null처리가 불가능하기 때문에 항상 null safe 함 )

Method Reference : null 처리 가능

(영상 : 20분 쯤...)

 

 

 

 

 

 

- Special Variables

View IDs :  tag의 id 를 camel 기법으로 표기

( ex :  <TextView id="@+id/text_id" ... onClick = "@{() -> presenter.save(textId)}" ) 

Context : context 로 표기

( ex :  <TextView ... onClick = "@{presenter.loadText(context, field)}" ) 

 

- animations 

addOnRebindCallback 을 이용하여 animation 처리가 가능하며, Transitions을 이용해 delay가 가능하다. (영상 : 24분 쯤...)

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/07   »
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
글 보관함