AAC (Android Architecture Components)
- 2017 ๊ตฌ๊ธ I/O์์ ๋ฐํ
- 2018 ๊ตฌ๊ธ I/O์์ ๋ฐํ๋ Jetpack์ผ๋ก ํตํฉ
- ์ํคํ
์ฒ ์ปดํฌ๋ํธ๊ฐ ๊ณต๊ฐ๋๊ธฐ ์ ๊น์ง๋ ์๋๋ก์ด๋ ์ฑ์์ ํน์ ์ํคํ
์ฒ๊ฐ ๊ถ์ฅ๋์ง ์์๋ค.
- ๊ฐ๋ฐ์๋ค์ ๋ฐ๋ผ์ MVP, MVC, MVVM, MVPP ๋ฑ ๋ค์ํ ์ํคํ
์ฒ๊ฐ ์ ํ๋์๋ค.
- ์๋๋ก์ด๋ ์ฑ์ ์ํ ์ํคํ
์ฒ๋ฅผ ์ ์ํ๊ณ ์ด๋ฅผ ๊ตฌํํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ๊ณตํ๊ณ ์ ๊ตฌ๊ธ์์ ์ํคํ
์ฒ ์ปดํฌ๋ํธ๋ฅผ ๊ณต๊ฐํ์๋ค.
DataBinding
- ๋ฐ์ดํฐ๋ฅผ UI์ ์ฝ๊ฒ ๋ฐ์ธ๋ฉํ๊ธฐ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ๋ฐ, ๋ทฐ์ ๊ด๋ จ๋ ์ฝ๋๋ ๋ชจ๋ xml์์ ์์ฑํ๋ค๋ ์ ์์ ์ํคํ
์ฒ ์์๋ผ๊ณ ๋ณผ ์ ์๋ค.
- findViewById()์ ์ํ ๋ทฐ ๊ฐ์ฒด ํ๋ ๋ฐ ์ด์ฉ์ ๋ฒ๊ฑฐ๋ก์์ ์ ๊ฑฐํ๊ธฐ ์ํ ๋ชฉ์
- Butterknife ๋ฑ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ด์ฉ๋ณด๋ค ํจ์จ์
- ์๋๋ก์ด๋ ์ํคํ
์ฒ ์ปดํฌ๋ํธ์ ๊ตฌ์ฑ์์
<layout>
<data>
<variable name="model1" type="com.example.test_databinding.User" />
</data>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text='@{"i am include xml.. binding data : " + model1.name}' />
</layout>
Lifecycle Aware Components
- ์กํฐ๋นํฐ, ํ๋๊ทธ๋จผํธ์ ์๋ช
์ฃผ๊ธฐ๋ฅผ ์ต์ ๋ฒ์์ ๋ฐ๋ก ์ฒ๋ฆฌํ๋๋ก ์ค๊ณ
- ์๋ช
์ฃผ๊ธฐ๋ฅผ ๊ฐ๋ Owner์ ์ด๋ฅผ ๊ด์ฐฐํ๊ณ ์๋ค๊ฐ ์ฒ๋ฆฌํ๋ Observer
Navigation Components
- ํ๋ฉด ๊ฐ ์ด๋์ ๊ฐํธํ๊ฒ ์์ฑํ ์ ์๋๋ก ๋์์ฃผ๋ Jetpack์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํน์ ํด
- ํ๋์ ๋ฉ์ธ ์กํฐ๋นํฐ์ ์ฌ๋ฌ ๊ฐ์ ํ๋๊ทธ๋จผํธ๋ก ํ๋ฉด์ ์ค๊ณํ๋ ๊ฒ์ ๋ชฉ์ ์ผ๋ก ํ๋ค.
Room
- SQLite๋ฅผ ์ฌ์ฉํจ์ ์์ด ๋ณ๋์ Query๋ฌธ ์์ฑ์์ด ๊ฐํธํ๊ฒ Insert, Delete ๋ฑ์ ๋์์ ํ ์ ์๊ฒ๋ ๋์์ฃผ๋ ORM ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- ์๋๋ก์ด๋ ์ฑ์์ ์ฌ์ฉํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ Room์ผ๋ก ๊ถ๊ณ
Paging
- ๋ฆฌ์ฌ์ดํด๋ฌ๋ทฐ์์ ํ์ด์ง ์ฒ๋ฆฌ๋ฅผ ์ฝ๊ณ ํจ์จ์ ์ผ๋ก ์์ฑํ ์ ์๊ฒ ํด์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- ํ์ด์ง ๋ ๋ฐ์ดํฐ๋ ๋ฉ๋ชจ๋ฆฌ ๋ด์ ์บ์ฑ๋๋ค.
- ๋ฐ์ดํฐ ์์ฒญ ๋ฐ ์ค๋ณต ์ ๊ฑฐ ๊ธฐ๋ฅ์ด ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณต๋๋ค.
- ๋ฐ์ดํฐ์ ๋๊น์ง ์คํฌ๋กค์ ํ๋ฉด, ์ด๋ํฐ๊ฐ ์๋์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๋ค.
WorkManager
- WorkManager๋ ํน์ ์์
์ ์ ์ (Defer) ์ฒ๋ฆฌ ๋ฐ ๋น๋๊ธฐ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ค.
- JobScheduler, FirebaseJobDispatcher, AlarmManager ๋ฑ์ ํตํฉํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
MVC vs MVVM
์ฐธ๊ณ ํ ํฌ์คํ
MVC
Controller
๊ฐ ์ฌ์ฉ์ ๋์์ ๋ฐ์๋ค์. (ํ
์คํธ ์
๋ ฅ, ๋ฒํผ ํฐ์น ๋ฑ)
Controller
๊ฐ ์ฌ์ฉ์์ ๋์์ ๋ฐ๋ฅธ Model
์
๋ฐ์ดํธ๋ฅผ ์์ฒญํจ.
Controller
๊ฐ Model
์ ๋ํ๋ผ View
๋ฅผ ์ ํํจ.
View
๋ Model
์ ์ฐธ์กฐํ์ฌ UI๋ฅผ ์
๋ฐ์ดํธํจ.
MVC์ ๋จ์
- ์์ฐ์ค๋ View์ Model ๊ฐ์ ์์กด์ฑ์ด ๋์์ง๋ค.
- ์ปจํธ๋กค๋ฌ๊ฐ Model๊ณผ View ์ฌ์ด์์ ๋ฐ์๊ฒ ์์ง์ด๊ณ ์๋ค. (ํผ์์ ์ฌ๊ธฐ์ ๊ธฐ ์์ฒญ์ ๋ณด๋ด์ผ ํ๋ ์ปจํธ๋กค๋ฌ์ ๋์์ ๋น์ฐํ ๋ฌด๊ฑฐ์์ง ์๋ฐ์ ์๋ค.)
- ๋ฐ๋ผ์ ์ ์ง๋ณด์๋ฅผ ์ํด ์ฝ๋๋ฅผ ์๋ชป ๊ฑด๋๋ ธ๋ค๊ฐ, UI ํ๋ ์ ์คํต ํ์์ด๋ ๋ฉ๋ชจ๋ฆฌ ๋์ ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
- ์ด์ฒ๋ผ MVC ํจํด์ ๊ตฌํํ๊ธฐ ์ฌ์ด ์ฅ์ ์ด ์๋ ๋ฐ๋ฉด์, ๊ธฐ๋ฅ ์ถ๊ฐ ๋ฐ ๋ณ๊ฒฝ์ ์์ด์ ์ ์ง๋ณด์๊ฐ ์ด๋ ต๋ค.
MVVM
- MVC์ ๋จ์ ์ ๋ณด์ํ๊ณ ์ ๋ฑ์ฅํ ๋์์ธ ํจํด
- ๊ธฐ์กด์ MVC์์ ์ปจํธ๋กค๋ฌ์๊ฒ ๋ง์คํ ์ญํ ์ ๋ถ์ฌํ๊ธฐ๋ณด๋ค, View์ Model์ ๋์ ์์ฒด๋ฅผ ๋ถ๋ฆฌํ์ฌ ์ ์ง๋ณด์๋ฅผ ํธ๋ฆฌํ๊ฒ ํ ์ ์๋๋ก ๋์์ค๋ค.
View
- Activity/Fragment๊ฐ View ์ญํ ์ ํจ.
- ์ฌ์ฉ์์ ๋์์ ๋ฐ์๋ค์.
- ViewModel์ ๋ฐ์ดํฐ๋ฅผ ๊ด์ฐฐํ์ฌ UI ๊ฐฑ์
ViewModel
- View๊ฐ ์์ฒญํ ๋ฐ์ดํฐ๋ฅผ Model์ ์์ฒญํจ.
- Model๋ก๋ถํฐ ์์ฒญํ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์.
Model
- ViewModel์ด ์์ฒญํ ๋ฐ์ดํฐ ๋ฐํ
- Room, Realm๊ณผ ๊ฐ์ DB ์ฌ์ฉ์ด๋ Retrofit์ ํตํ ๋ฐฑ์๋ API ํธ์ถ (๋คํธ์ํน)์ด ๋ณดํธ์
MVVM์ ์ฅ์
- View๋ ViewModel์ด ์ฅ๊ณ ์๋ ๋ฐ์ดํฐ๋ฅผ ๊ด์ฐฐํ๋ค. ๋ฐ๋ผ์ MVC ํจํด์ฒ๋ผ View๊ฐ Model์ ์ง์ ์ ๊ทผํ์ง ์๊ธฐ ๋๋ฌธ์ View๋ UI ๊ฐฑ์ ์๋ง ์ง์คํ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฐ์ดํฐ๋ฅผ ๊ด์ฐฐํ๊ณ ์๋ ๋งํผ ๋ฐ์ดํฐ์ ๋ณํ์ ๋์ฑ ๋ฅ๋์ ์ผ๋ก ์์ง์ด๊ฒ ๋๋ค.
- ViewModel์ด ๋ฐ์ดํฐ๋ฅผ ์ฅ๊ณ ์์ผ๋ฏ๋ก, ๋ฉ๋ชจ๋ฆฌ ๋์ ๊ฐ๋ฅ์ฑ ๋ฐฐ์ (๋ฐ์ดํฐ๊ฐ Activity/Fragment์ ๊ฐ์ View์ ๋ผ์ดํ์ฌ์ดํด์ ์์กดํ์ง ์๊ธฐ ๋๋ฌธ์)
- ๊ธฐ๋ฅ๋ณ ๋ชจ๋ํ๊ฐ ์ ๋์ด ์์ด ์ ์ง๋ณด์์ ์ฉ์ดํ๋ค. (ViewModel ์ฌ์ฌ์ฉ, DB ๊ต์ฒด ๋ฑ์ ์์
์ด ํธ๋ฆฌํด์ง๋ค.)
MVVM์ ์ ์ฉํ AAC
Activity/Fragment: View
- UI๋ฅผ ๊ตฌ์ฑํ๊ณ ์ ์ ์ ์ํธ์์ฉ ํ๋ ๋ถ๋ถ (์๋ช
์ฃผ๊ธฐ์ ๋ณ๊ฒฝ์ ๊ฐ์ง)
- ์๋ช
์ฃผ๊ธฐ์ ๋ณ๊ฒฝ์ด ๋ฐ์ํ๋ฉด ViewModel์ ๋ฐ์ดํฐ ๊ฐฑ์ ์์ฒญ
- ViewModel์์ ์ ๋ฌํ LiveData์ ๋ด์ฉ์ ํ๋ฉด์ ์ถ๋ ฅ
ViewModel: View์ Model์ ๋ถ๋ฆฌ
- View์ Model์ ๋ถ๋ฆฌ์ํค๊ธฐ ์ํ ๊ฐ๊ต (์์ ๋ค๋ฆฌ) ์ญํ
- View์ ์๋ช
์ฃผ๊ธฐ ๋ณ๊ฒฝ์ ๊ฐ์งํ๊ณ ๋ณ๊ฒฝ์ด ๋ฐ์ํ๋ฉด Repository๋ฅผ ์คํ
- Repository์์ ๋ฐ์ํ LiveData๋ฅผ View์ ์ ๋ฌ
Repository: ๋ฐ์ดํฐ ์ฒ๋ฆฌ (Model)
- ๋ฐ์ดํฐ์ ์ ์ฅ ๋ฐ ํ๋์ด ์ฃผ๋ชฉ์
- SQLite์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ ๋๋ Room, ๋คํธ์ํฌ ํต์ ์ผ๋ก ์๋ฒ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ๋๋ Retrofit์ ์ฃผ๋ก ์ฌ์ฉ
ViewModel
- MVVM์ ํต์ฌ์ ํ๋ฉด (View)์์ ๋น์ฆ๋์ค ๋ก์ง (Model)์ ๋ถ๋ฆฌํ์ฌ ๊ฐ๋ฐํ๋ ๊ฒ
- Activity, Fragment์์ UI๋ฅผ ์ฒ๋ฆฌํ๊ณ ViewModel์์ ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌ
- Activity์์ onSaveInstanceState() ํจ์๋ฅผ ์ด์ฉํด Bundle์ ์กํฐ๋นํฐ์ ์ํ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๊ฒ๋ ViewModel๋ก ๋์ฒดํ ์ ์๋ค.
์ฌ์ฉ ๋ฐฉ๋ฒ
- build.gradle ํ์ผ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ dependency ์ค์
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1
- ViewModel ํด๋์ค๋ฅผ ์์ ๋ฐ์์ ์์ฑ
class MyViewModel: ViewModel() {
val user: MutableLiveData<User>
get() {
val user = MutableLiveData<User>()
user.postValue(User("gildong", "hong1"))
return user
}
}
์กํฐ๋นํฐ์์ ViewModel์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
- ViewModel ๊ฐ์ฒด๋ฅผ ์ง์ ์์ฑํ ์๋ ์์ผ๋, ViewModelProvider๋ฅผ ์ด์ฉํ๋ ๊ฒ ๊ถ์ฅ๋๋ค.
- ์๋ํ๋ฉด, ViewModel์ ์ด์ ์ค ํ๋๊ฐ ์กํฐ๋นํฐ์ ์ํ ๋ฐ์ดํฐ๋ฅผ Bundle์ ์ด์ฉํ์ง ์๊ณ ์๋ ์ฝ๊ฒ ์ ์ฅํ ์ ์๋ค๋ ๊ฑด๋ฐ, ๊ฐ์ฒด๋ฅผ ์ง์ ์์ฑํ๋ฉด ์ด ์ด์ ์ด ์ฌ๋ผ์ง๋ค.
- ViewModelProvider๋ฅผ ์ฌ์ฉํด์ ๊ฐ์ฒด๋ฅผ ์์ฑํด์ผ ViewModel์ ์๋ช
์ฃผ๊ธฐ๊ฐ ์กํฐ๋นํฐ์ ๋ค๋ฅด๊ฒ ์์ง์ธ๋ค. ๊ทธ๋ฐ๋ฐ, ๊ฐ์ฒด๋ฅผ ์ง์ ์์ฑํ๋ ๊ฒฝ์ฐ์๋ ViewModel์ ์๋ช
์ฃผ๊ธฐ๊ฐ ์กํฐ๋นํฐ์ ๋์ผํ๊ฒ ์์ง์ด๋ฏ๋ก, ์กํฐ๋นํฐ๊ฐ ์๋ฉธ๋ ๋ ๋ทฐ๋ชจ๋ธ๋ ๊ฐ์ด ์๋ฉธ๋์ด ์กํฐ๋นํฐ์ ์ํ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ ์๋ค. ๋๋ ์กํฐ๋นํฐ๊ฐ ์์ฑ๋ ๋ ๋ทฐ๋ชจ๋ธ์ด ๋ค์ ์์ฑ๋๋ ๋ฌธ์ ๋ ๋ฐ์ํ ์ ์๋ค.
val model = ViewModelProvider(this).get(MyViewModel::class.java)
model.user.observe(this, {
binding.textView.text = "${it.firstName}, ${it.lastName}"
})
- kotlin property delegator๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์๊ณผ ๊ฐ์ด ๊ฐ๊ฒฐํ ์ฝ๋๋ก ๋ทฐ๋ชจ๋ธ ๊ฐ์ฒด๋ฅผ ์์ฑํ ์๋ ์๋ค.
implementation "androidx.activity:activity-ktx:$activity_version"
val model: MyViewModel by viewModels()
- ๋ทฐ๋ชจ๋ธ ๋ด์์ ์ดํ๋ฆฌ์ผ์ด์
๊ฐ์ฒด๋ฅผ ํ์๋ก ํ๋ ๊ฒฝ์ฐ์๋ ViewModel์ ์๋ธ ํด๋์ค์ธ AndroidViewModel์ ์ฌ์ฉํ๋ฉด ๋๋ค.
- ViewModel() : ๊ธฐ๋ณธ์ ์ผ๋ก๋ ๋งค๊ฐ๋ณ์ ์์.
- AndroidViewModel(Application application) : ์ดํ๋ฆฌ์ผ์ด์
๊ฐ์ฒด๋ฅผ ๋ทฐ๋ชจ๋ธ์ ๋๊ฒจ์ค.
ViewModel์ ์๋ช
์ฃผ๊ธฐ
- ํ๋ฉด ํ์ ์ ์ํด ์กํฐ๋นํฐ๊ฐ ์๋ฉธ๋๋ค๊ณ ํด๋ ๊ทธ ์ํ ๋ฐ์ดํฐ๋ ViewModel์ ์ฌ์ ํ ์ ์ฅ๋์ด์๋ค. ๊ทธ๋์ ์กํฐ๋นํฐ๊ฐ ๋ค์ ์ฌ๊ฐ๋๋ฉด ๊ทธ ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ ์ ์๋ค.
ํ๋๊ทธ๋จผํธ์์ ViewModel์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
- ์กํฐ๋นํฐ ๋ด์ ์ฌ๋ฌ ๊ฐ์ ํ๋๊ทธ๋จผํธ๊ฐ ์๋ ๊ฒฝ์ฐ, ํ๋๊ทธ๋จผํธ ๊ฐ์ ๋ทฐ๋ชจ๋ธ์ ๊ณต์ ํด์ผ ํ ๋๊ฐ ์๋ค.
- ViewModel์ Lifecycle Owner๋ฅผ ์กํฐ๋นํฐ๋ก ๋ณ๊ฒฝํ๋ฉด, ์ฌ๋ฌ ํ๋๊ทธ๋จผํธ๊ฐ ํ๋์ ๋ทฐ๋ชจ๋ธ์ ๊ณต์ ํ ์ ์๋ค.
- ViewModelProvider์ ๋งค๊ฐ๋ณ์๋ก Lifecycle Owner๋ฅผ ์ง์ ํ๋ฉด ๋๋ค.
val model = ViewModelProvider(requireActivity()).get(MyFragmentViewModel::class.java)
LiveData
- ViewModel์ ๊ฒฐ๊ณผ๋ฅผ View์ ๋๊ธธ ๋, LiveData ํ์
์ผ๋ก ๋๊ธด๋ค.
- ViewModel์์ String ๋ฑ์ ํ์
์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํดํ ์๋ ์์ง๋ง, LivaData ํ์
์ผ๋ก ๋ฆฌํดํด์ผ Observer๊ฐ ๊ทธ ๊ฒฐ๊ณผ๊ฐ์ ๋ฐ์ ์ด์ฉํ ์ ์๋ค.
- LiveData์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ์
๋ฐ์ดํธ ํ๊ณ ์ถ์ ๊ฒฝ์ฐ setValue(T) ๋ฐ postValue(T) ๋ฉ์๋๋ฅผ ์ด์ฉํ๋ฉด, LiveData๋ฅผ ๊ด์ฐฐํ๋ observer์๊ฒ ์
๋ฐ์ดํธ ๋ ๋ฐ์ดํฐ๋ฅผ ๋๊ฒจ์ค๋ค.
class MyViewModel: ViewModel() {
fun someData(): String {
return "hello"
}
fun someData2(): MutableLiveData<String> {
val liveData = MutableLiveData<String>()
thread {
SystemClock.sleep(3000)
liveData.postValue("world")
}
return liveData
}
}
- LiveData์ ๋ณ๊ฒฝ์ ๊ฐ์งํ๋ Observer
- LiveData์ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด Observer์ onChanged() ํจ์๊ฐ ์๋์ผ๋ก ํธ์ถ๋๋ค.
- ๋ ์ด์ ์ํ ๋ณํ๋ฅผ ๊ฐ์งํ ํ์๊ฐ ์์ด์ง๋ฉด, ๋ช
์์ ์ผ๋ก removeObservers() ํจ์๋ฅผ ํธ์ถํ๋ค.
val observer = object: Observer<String> {
override fun onChanged(t: String?) {
Log.d("kkang","onChanged......$t")
}
}
model.someData2().observe(this, observer)
val liveData = model.someData2()
liveData.removeObservers(this)
- Custom LiveData๋ LiveData๋ฅผ ์์ ๋ฐ์ ์์ฑ
- ViewModel ์ด์ธ์ ๋ค๋ฅธ ๊ณณ์์ ์ฌ์ฉ ๊ฐ๋ฅ
class MyLiveData : LiveData<String>() {
fun sayHello(name: String) {
postValue("Hello $name")
}
}
val liveData1 = MyLiveData()
liveData1.observe(this) {
Log.d("kkang", "result : $it")
}
liveData1.sayHello("kkang")
์ค์ต ์์
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1'
implementation 'androidx.activity:activity-ktx:1.2.3'
package com.tutorial.c100
import android.os.SystemClock
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import kotlin.concurrent.thread
class MyViewModel: ViewModel() {
var sum = 0
fun callSum(): MutableLiveData<String> {
val liveData = MutableLiveData<String>()
thread {
for(i in 1..10){
sum += i
liveData.postValue(sum.toString())
SystemClock.sleep(1000)
}
}
return liveData
}
}
package com.tutorial.c100
import android.os.Bundle
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import com.tutorial.c100.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
val model: MyViewModel by viewModels()
binding.button.setOnClickListener {
model.callSum().observe(this) {
binding.resultView.text = it
}
}
}
}