๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ด๋?
ํด๋ฆฐ์ํคํ ์ณ์์ ๋งํด ํ์ธ๋ฌ๊ฐ ๋งํ๋ GUIํ๋ก๊ทธ๋๋ฐ
The View is the humble object that is hard to test. The code in this obejct is kep as simple as possible.
The presenter is the testable object. Its job is to accept data from the application and format it for presentation so thaat the View can simply move it to the screen.
ํ๋ธ์ค๋ธ์ ํธ ํจํด์ ์ํด GUI๋ ๋ ๊ฐ๋ก ๋๋๋ค ๋ฐ๋ก ๋ทฐ(๊ตฌ์ฒด์ ๊ตฌํ์ฌํญ)์ ํ๋ ์ ํฐ(ํ ์คํฐ๋ธํ ํ๋๋ค)์ด๋ค.
Anything and everything that appears on the screen, and that the application has some kind of control over, is represented in the ViewMdoel as a string, or a boolean, or an enum. Nothing is left for the View to do other than to load the data from the view model into the screen. Thus the View is humble
UI๊ด๋ จ ์ฝ๋๋ ์ต๋ํ "humble"ํ๊ฒ ๋ง๋ค์ด์ผํ๋ค. ํ
์คํธํ๊ธฐ๊ฐ ์ด๋ ต๊ธฐ ๋๋ฌธ์ด๋ค.
๋ง์ดํฌ๋ก์ํํธ์์ ๋งํ๋ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ ์ ์
Data binding is the process that establishes a connection between the app UI and the data it displays.
๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ด๋ UI์ ๋ณด์ฌ์ค ๋ฐ์ดํฐ๋ฅผ ์ฐ๊ฒฐ์ง๋ ์์ ์ด๋ค.
Oneway binding causes changes to the source property to automatically update the target property, but changes to the target property are not propagated back to the source property. This type of binding is appropriate if the control being bound is implicitly read-only.
๋จ๋ฐฉํฅ ๋ฐ์ธ๋ฉ์ UI์ ์ ์ฉํด์ผํ ๋ฐ์ดํฐ ์
๋ฐ์ดํธ์ ์์ด read-only๋ฅผ ์ฐธ์กฐํ๋ ๊ฒ์ด ๋ฐ๋์งํ๋ค.
์น์ด๋ , ๋ชจ๋ฐ์ผ์ด๋ ์ด๋ค GUI ํ๋ ์์ํฌ๊ฐ ์ค๋ ์๊ด์์ด UI๊ฐ ๋ฐ์ดํฐ์ ์์กด์ฑ์ด ๊ฑธ๋ ค์๋ค๋ ์ฌ์ค์ ๋ฐ๋์ง ์๋๋ค. MVVM์ ์๋์ ์ธ ๊ป๋ฐ๊ธฐ ๊ฐ์ฒด๋ก ๋ง๋ค์ด์ผํ๋ UI์ ๊ฐ๋ณํ๋ ๋ฐ์ดํฐ ๋ณํ๋ก์ง์ ๋ถ๋ฆฌํจ์ผ๋ก์จ ๊ฐ๋ฐ์๋ก ํ์ฌ๊ธ ๋ก์ง์ ์ผ๋ก ๋ช
ํํ ๋ถ๋ฆฌ ์๋ ํ๋ก๊ทธ๋๋ฐํ ์ ์๊ฒ๋ ๋์์ฃผ๋ ํจํด์ด๋ค.
iOS์์ ์์ฃผ ์ฐ์ด๋ RxSwift ํ์ฉ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ ํจํด
sergdort ์์
https://github.com/sergdort/CleanArchitectureRxSwift
import Foundation
protocol ViewModelType {
associatedtype Input
associatedtype Output
func transform(input: Input) -> Output
}
1. ๋จผ์ ๋ทฐ๋ชจ๋ธ ์ธํฐํ์ด์ค๋ฅผ ๋ง๋ค์ด์ค๋ค.
2. ์ธํฐํ์ด์ค์ ๋ฐ๋ผ input, output, transform ์ ์ ์ํด์ค๋ค.
3. ๋ทฐ์ปจ์์ bindViewModel() ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ ๋ฐ์ธ๋ฉํด์ค๋ค.
๐ก Driver๋ ํซ์ต์ ๋ฒ๋ธ๋ก ๋ฐ์ดํฐ ํ๋ฆ์ ์ผ๊ด์ฑ์ ์ ์งํ๊ณ ์ฌ๋ฌ๋ทฐ๋ผ๋ฆฌ์ ๊ณต์ ๋ฅผ ๊ฐ๋ฅ์ผ ํด์ค๋ค. ๋ฟ๋ง ์๋๋ผ UI ๊ด๋ จ๋ ์์
์ด๊ธฐ ๋๋ฌธ์ error๋ฅผ ๋์ง์ง ์๊ณ ๋ฉ์ธ์ค๋ ๋์์ ์ค์ง ๊ฒฐ๊ณผ๊ฐ์ผ๋ก๋ง ๋์ ธ์ฃผ๊ธฐ ๋๋ฌธ์ MVVM ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ ์ต์ ๋ฒ๋ธ ํ์
์ผ๋ก ์ ํฉํ๋ค.
๐ก ์ฐธ๊ณ ํ ๋งํ ์ฌํญ์ผ๋ก๋ ๋ทฐ์ ๋ทฐ๋ชจ๋ธ์ ๊ฒฐ๊ตญ presentation ์ํคํ
์ณ์ด๊ธฐ ๋๋ฌธ์ fetch์ ๊ฐ์ ๋น์ฆ๋์ค ๋ก์ง ๋ค์ด๋ฐ์ ์ง์ํด์ผํ๋ค.
Rx ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ ๋ํ ๋์ ์๊ฐ
๊ฐ์ธ์ ์ผ๋ก ํ๋ก์ ํธ๋ฅผ ํ ๋ MVC๋ณด๋ค ๋ก์ง์ด ๋ช ํํ๊ฒ ๋ถ๋ฆฌ๋์ด ํจ์ฌ ํธํ๋ค๋ ๋๋์ ๋ฐ์๋ค. ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ MVVM + Rx ์กฐํฉ์ ์ต์ ์ ๋ฐฉ๋ฒ์ด ์๋๋ผ ์๊ฐํ๋ค. ๋ด๊ฐ ์๊ฐํ๋ ๋์์ Rx+MVVM ๋์ Combine+flux ์กฐํฉ์ด ๊ฐ์ฅ ์ข๋ค๊ณ ์๊ฐํ๋ค.
์ด์ :
1. MVVM ํจํด ์์ฒด๋ ์๋ฌด๋ฆฌ ์ธํฐํ์ด์ค๋ฅผ ๋๋คํ๋๋ผ๋ ๋ทฐ์ ๋ทฐ๋ชจ๋ธ์ด 1๋1 ๊ด๊ณ๋ก ์ด์ด์ง ๊ฐ๋ฅ์ฑ์ด ํฌ๋ค.
2. ํผ์คํธํํฐ๋ฅผ ์ฐ๋ ๊ฒ์ด ์ ์ง๋ณด์์ธก๋ฉด์์ ์ข๋ค (Rx๋์ Combine)
3. Flux์์๋ ์ด๋ฒคํธ ํ์ ์ด ๋ช ์๋จ์ผ๋ก์จ ์ด๋ฒคํธ์ ๋น์ฆ๋์ค๋ก์ง์ ๊ด๊ณ๊ฐ ๋ ๋์จํ๋ค. ๋ฐ๋ผ์ ๋น์ฆ๋์ค ๋ก์ง ๋ฉ์๋์ ์ฌ์ฌ์ฉ์ฑ์ด ๋์์ง๋ค.
๋ ํผ๋ฐ์ค
https://viblo.asia/p/tim-hieu-ve-redux-saga-bWrZnODmlxw
https://www.inflearn.com/course/ios-์ํคํ ์ฒํจํด-์ด๋ก /dashboard
https://learn.microsoft.com/en-us/dotnet/desktop/wpf/data/?view=netdesktop-8.0
'๐ฆ Flutter' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| WWDC 16 | Concurrent Programming with GCD (0) | 2024.06.05 |
---|---|
Flutter ํ๋ฉด์ ํ์์ routes ์ onGenerateRoute ์ ์ฐจ์ด (0) | 2024.06.04 |
Hot Observable & Cold Observable (0) | 2024.06.01 |
Future/Stream Provider์ create ์์ watch ๋ก ๊ตฌ๋ ์ ๋ํ๋๋ ์๋ฌ (0) | 2024.06.01 |
Stateless Widget ์ const๋ฅผ ๋ถ์ฌ์ผํ๋ ์ด์ (0) | 2024.05.30 |