5. What is Architecture
Application Architecture๋ ์ฑ์ ํด๋์ค๋ค์ ๋ํ ๋์์ธ๊ณผ ๊ทธ๋ค ์ฌ์ด์ ๊ด๊ณ.
์ฑ์ ๊ตฌ์ฑํ๋๋ฐ ํ ๊ฐ์ง ๋ฐฉ๋ฒ๋ง ์๋ ๊ฒ์ ์๋๋ค. ์ง์ ์ค๊ณํ๋ ๊ฒ์ ์ํฉ, ํ์, ์ทจํฅ ๋ฑ์ ๊ฐํ ์์กด์ฑ์ ๋๋ค.
์ด์ ๋ง์ฐฌ๊ฐ์ง๋ก ์๋๋ก์ด๋ ์ฑ๋ ๋ค์ํ ์ค๊ณ ์คํ์ผ์ด ์๋ค. ๋ ๊ฐ ๋ฐฉ์์ ์ฅ๋จ์ ์ด ์๋ค. ์๋ก๊ฐ ๊ณตํต์ ์ ๊ฐ๊ธฐ๋ ํ๋ค. ๊ฐ๊ธฐ ๋ค๋ฅธ ์ฑ์ ํ์๋ ํ์ ํฌ๊ธฐ, ํ์ ์ฑํฅ ๋ฑ์ ๋ฐ๋ผ ์ ํฉํ ์คํ์ผ์ด ๋ค๋ฅผ ์ ์๋ค.
์ด๋ฒ lesson์์๋ a single multipurpose architectural pattern์ ์ฌ์ฉํ๋๋ฐ MVVM๊ณผ ๋น์ทํ๋ค.
6. Our App Architecture
Software design principle
- Separation of concerns: Divide your code into classes, each with separate, well defined responsibilities.
Architecture๋ ์ด๋ ํด๋์ค๊ฐ ์ด๋ค ์ญํ ์ ํด์ผํ๋์ง figure out ํ๊ธฐ์ํด ๊ฐ์ด๋๋ผ์ธ์ ์ค๋ค.
LiveData๋ ViewModel๊ณผ UIController ๊ฐ์ ์ ๋ณด๋ฅผ ๊ต๋ฅํ๋๋ฐ ๋งค์ฐ ์ค์ํ๋ค. communicating update and redraw the screen.
7. ViewModel
์ฑ์ UI ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ abstract class ์ด๋ค. ๊ทธ๋ฆฌ๊ณ configuration changes๋ฅผ ์์กดํ๋ค.
ViewModel์ด ์ ์ฉํ ์ด์ ๋ ๋ฌด์์ธ๊ฐ?
์คํฌ๋ฆฐ์ ํ์ ํ๋ ๊ฒ๊ณผ ๊ฐ์ configuration change๊ฐ ๋ฐ์ํ๋ฉด activity์ ๋ด๋ถ์ ์๋ ๋ชจ๋ fragments๋ ํ๊ดด๋๊ณ OS์ ์ํด์ rebuild ๋๋๋ฐ ๊ฐ๋ฐ์๊ฐ ๋ฐ์ดํฐ์ ๋ํด์ ์ฌ๋ฐ๋ฅธ ์ฒ๋ฆฌ๋ฅผ ํ์ง ์์ผ๋ฉด ๋ฐ์ดํฐ๋ ์ฌ๋ผ์ ธ๋ฒ๋ฆฐ๋ค. ์์์ onSaveInstanceState๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ๋ดค์ง๋ง ์ ์ฅํด์ผํ ๋ณต์กํ ๋ฐ์ดํฐ๊ฐ ๋ง๋ค๋ฉด ์ข์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์๋๋ค. ๊ทธ๋์ ViewModel์ด ๋์ ๋๋ค.
UI ๋ฐ์ดํฐ๋ฅผ Fragment์ ๋์ง ์๊ณ ViewModel์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ fragment๊ฐ ViewModel์ ๋ํ reference๋ฅผ ๊ฐ๋๋ค. ViewModel์ Configuration changes๋ฅผ ์์กดํ ์ ์๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ fragment๊ฐ ํ๊ดด๋๊ณ ๋ค์ ๋ง๋ค์ด์ง๋ ๋์์๋ ๋ชจ๋ fragment์ ๋ณด์ฌ์ ธ์ผํ๋ ๋ฐ์ดํฐ๋ ViewModel์ ๋จ์์๋ค. ๋ค์ ์์ฑ๋ fragment๋ฅผ ๋์ผํ ViewModel์ ์ฐ๊ฒฐํด์ค๋ค๋ฉด ๋ฐ์ดํฐ๋ ๊ทธ๋๋ก ์๋ค!
10. Exercise: Populate the GameViewModel
ViewModel vs. UI Controller
- ViewModel holds data for UI
- UI Controller only displays and gets user/OS events.
(Should have as little responsibility as possible, ํ๋ฉด์ ๊ทธ๋ฆฌ๊ณ input ์ด๋ฒคํธ๋ฅผ ๊ฐ์ง) - UI Controller does NOT make decisions.
UI Controller๋ views๋ฅผ instantiateํ๊ณ containํ๋ค. - ViewModel should never contain references to activities, fragments or views.
Why? ์ฐ๋ฆฌ๊ฐ ViewModel์ ์ฌ์ฉํ๋ ์ด์ ์ ๋ํด ์๊ฐํด๋ณด๋ผ. ViewModel์ด configuration changes๋ฅผ ์ด์๋จ๊ธฐ ๋๋ฌธ์ด๋ค.
๋ณธ๋ acitivity, fragment and view๋ configuration changes ์์ ์ด์๋จ์ ์ ์๋ค.
ViewModel์์ configuration changes๋ก ๋ ์ด์ ํ๋ฉด์ ๋ณด์ฌ์ง์ง ์๋ acitivity, view, fragment์ ๋ํ reference๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ฉด clean up ๋์ด์ผํ๋ reference๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ฒ์ด๋ค.
Best case scenario์์๋ ์ฌ์ํ ๋ฉ๋ชจ๋ฆฌ ๋์์ด์ง๋ง, worst case scenario์์๋ ์คํฌ๋ฆฐ์ ์๋ old fragment๋ก ๋ฌด์ธ๊ฐ๋ฅผ ํ๋ ค๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ error๋ฅผ ๋ฐ์์ํฌ ์ ์๋ค.
11. The Benefit of a Good Architecture
์ด ๋์์ธ์ ๋ค๋ฅธ ๋ถ๋ฉด์ผ๋ก code๊ฐ modularํ๋ค๋ ๊ฒ์ธ๋ฐ, UI Controller๋ ViewModel์ ๋ํด์ ์์ง๋ง ViewModel์ UI Controller์ ๋ํด์ ๋ชจ๋ฅธ๋ค.
์ด architecture์ ๋ชฉํ ์ค ํ๋๋ class ๊ฐ์ reference์ ์๋ฅผ ์ ๊ฒ ์ ์งํ๋ ๊ฒ์ด๋ค. ๋ ๋ค๋ฅธ ์ธก๋ฉด ๋ฐ ์ ์ต์ ViewModel์ด activity๋ fragments, views์ ๋ํด reference๋ฅผ ๊ฐ์ง๊ณ ์์ง ์๋ค๋ ๊ฒ์ด๋ค. ์ด๊ฒ์ testing ์์ ์ ์ฉํ๋ค. ํ๋ก์ ํธ์๋ 2๊ฐ์ง Test๊ฐ ์กด์ฌํ๋๋ฐ android Test(์๋ฎฌ๋ ์ดํฐ๊ฐ ํ์ํ)์ Test(์๋ฎฌ๋ ์ดํฐ๊ฐ ํ์์๋)์ด๋ค. ViewModel์ ๋ํ reference๊ฐ ์๊ธฐ ๋๋ฌธ์ pure lightweight ์๋๋ก์ด๋ ํ๋ ์์ํฌ์ ์์กดํ์ง ์๋ ์ ๋ ํ ์คํธ๋ฅผ ์งํ ํ ์ ์๊ณ ๋ฐ๋ผ์ ํ ์คํธ๋ฅผ ์์ฑํ๋๋ฐ์ ๋ ๋น ๋ฅด๊ณ ์ฝ๋ค.
- organized: the code is more organized, manageable, and debuggable
- easier to debug: protect yourself from having to worry about lifecycle problems and bugs.
- fewer lifecycle issues
- modular: easier to swap out and update sections of code
- testable
13. LiveData
LiveData: An observable data holder class that is lifecycle-aware
LiveData ๋ด๋ถ์ ์ธ์ฌ์๋ Data๊ฐ ๋ฐ๋๋ฉด state๊ฐ ๋ณํ๋ ๊ฒ๊ณผ ๊ฐ๋ค.
15. Lifecycle Awareness
- LiveData will only update UI Controllers that are actually on-screen
- If your fragment goes off-screen and the value of LiveData changes, it would not update the off-screen fragment. If UI Controller is off-screen, it gets no updates. - If UI Controller comes back on-screen, get the current data immediately
- If UI Controller observes, it gets the current data immediately
- If UI Controller is destroyed, it cleans up the connection.
16. Exercise: Add LiveData Encapsulation to GameViewModel
์บก์ํ(Encapsulation): The notion of restricted direct access to the object's fields. ์ธ๋ถ์์ ๋ด๋ถ์ ๊ฐ์ ์ฝ๊ฒ ์์ ํ ์ ์๋ค๋ฉด ์ฌ๋ฌ ๋ฒ๊ทธ๋ฅผ ์ผ๊ธฐํ ๊ฒ. ๋ฒ๊ทธ๋ฅผ ์ฐพ๊ธฐ๋ ์ด๋ ค์์ง.
ํด๊ฒฐ๋ฐฉ๋ฒ
๋ด๋ถ์๋ mutableLiveData, ์ธ๋ถ์๋ LiveData. Kotlin backing property๋ผ๊ณ ๋ถ๋ฆ. It allows you to return something from a getter other than the exact object.
22. Exercise: Add a ViewModelFactory
ViewModelFactory: A class that knows how to create ViewModels. Factories are classes that knows how to initiate object.
'Android & Kotlin' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Overloading / Overriding (0) | 2022.03.02 |
---|---|
Lesson 6: App Architecture (Persistence) (0) | 2022.02.23 |
๊ณต๋ถ ์ฃผ์ (0) | 2022.02.19 |
Lesson 4: Activity & Fragment Lifecycle (0) | 2022.02.11 |
Lesson 3: App Navigation (0) | 2022.02.08 |