๋ง๋ณด๊ธฐ์ ๋ง์ง๋ง์ผ๋ก, ๊ฐ๋จํ๊ฒ ํ๋ก์ ํธ์ ์ ์ฉํด๋ณด์. MVVM๊ณผ ์ฐฐ๋ก์ธ RxSwift๋ฅผ ์ ์ฉํด๋ณด๋ฉด์ ์ํคํ ์ณ์ ์ฌ์ฉ๋ฐฉ๋ฒ์ ๋ํด ์ต์ํด์ ธ๋ณด์.
ํ๋ก์ ํธ ๊ฐ์
- ๋ฒํผ์ ๋๋ฅด๋ฉด ๊ฐ์ด ๋ณ๊ฒฝ๋๊ณ ์๋์ ์ด ๊ธ์ก์ด ๋ํ๋๋ค.
- ํด๋น ํ๋ก์ ํธ์ UI๋ง ๋์ถฉ ์์ฑ๋ ์ํ์์ ๋ก์ง์ MVVM์ผ๋ก ๋ง๋๋ ๊ฒ์ด ๋ชฉ์ .
๋ฌธ์ ์
- MVVM์ ํต์ฌ์, View์ ๊ด๋ จ๋ ๊ฐ๋ค์ ๋ชจ์๋๋ ๊ณต๊ฐ์ผ๋ก์, ๊ฐ์ด ๋ณ๊ฒฝ๋์์ ๋ View์์ ์ด๋ฅผ ๊ฐ์ ธ๊ฐ๋๋ก ํ๋ ๊ตฌ์กฐ๋ฅผ ๋ง๋๋ ๊ฒ์ด๋ค.
- ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์์์ ๋ฐฐ์ด Rx์ ๊ฐ๋
์ ์ฌ์ฉํ๊ธฐ๊ฐ ์ฉ์ดํ ๊ฒ
- Observable๊ณผ ๊ฐ์ ๊ฐ๋ ์ ์ฌ์ฉํ๋ฉด, View ์์ View Model์ ๊ฐ์ subscribeํ๋ฉด ํด๊ฒฐ๋๊ธฐ ๋๋ฌธ.
- ํ์ง๋ง ๋ฌธ์ ๊ฐ ์๋๋ฐ, View์์ ๋ฐ์ํ๋ action์ ๊ธฐ๋ฐ์ผ๋ก ViewModel์ ๊ฐ์ ๋ณ๊ฒฝํด์ผ ํ๋ ํ์์ฑ์ด ์๊ธด๋ค.
- Observable์ ๋จ์ํ ๊ฐ์ ๋ฐ์๋จน๋ ๋ ์์ด๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ด ๋ถ๊ฐ๋ฅํ๋ค.
- ์ด๋ฐ ํ์์ฑ์ ์ํด ๋์จ ๊ฒ์ด
PublishSubject
๋ผ๋ ๋ ์์ด๋ค.
๊ฐ์
- ์ด๋ฐ ๋ทฐ๋ชจ๋ธ์ ๋ง๋ค์ด๋๊ณ , view์ ๊ด๋ จ๋ ๊ฐ์ ์ฌ๊ธฐ์ ์ ๋ฐ์ดํธ๋ฅผ ํ๊ณ , subscrie๋ฅผ ํตํด์ view๋ฅผ ์๋ ์ ๋ฐ์ดํธํ๋ ๊ฒ์ด ๋ชฉ์ ์ด๋ค.
- ์ด๋ ๊ฒ ๋ฌถ์ด ๋๋ ์์ ์ viewDidLoad์์ ์ํํ๋ค.
- ์๋ฅผ ๋ค๋ฉด ์ด๋ฐ์์ผ๋ก ์ฒ๋ฆฌํ๋ค.
- ๊ทธ๋ฐ๋ฐ, ์ด๋ฌํ ๋ฐฉ๋ฒ์์
RxCocoa
๋ผ๋ ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด, ๋ณด๋ค ์ฝ๊ฒ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค.- UIKit์์ Rx๋ฅผ ํธํ๊ฒ ์ฌ์ฉํ๊ธฐ ์ํด ์ ๊ณตํ๋ ํ๋ ์์ํฌ์ด๋ค.
- ์์ viewModel์ ๋ณด๋ฉด, menu๊ฐ ๋ณ๊ฒฝ๋จ์ ๋ฐ๋ผ ํ์๋๋ ๋ณ์์ ๊ฐ์ ๋ง๋ค์ ์๊ฒ ๋๋ค.
- ์ด๋ ๊ฒ ์ฐ๊ฒฐ๋ ๊ด๊ณ ์์ฒด๋ฅผ stream์ด๋ผ ํ๋ค.
- ์ด๋ ๊ฒ ํ๋ฉด ์ข์ ์ ์ด ์๋๋ฐ, ์ผ๋จ subscribe๋ฅผ ์ฌ์ฉํ๋ฉด
[weak self]
๋ฅผ ์ฌ์ฉํด์ฃผ์ด์ผ ํ๋ค. - ํ์ง๋ง binding์ ์ฌ์ฉํ๋ฉด ์ํ์ฐธ์กฐ ์์ด ๊ฐ๋ฅํ๋ค. ์๋ง ๋ด๋ถ๊ตฌํ์ผ๋ก ์จ๊ฒจ์ ธ ์์ ๋ฏ
- ๊ทธ๋ฆฌ๊ณ ์ฝ๋ ๊ธธ์ด๋ ์ค์ด๋ ๋ค.
subject
- ์์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ฉด PublishSubject์ ํน์ฑ์ ์ฐ๊ฒฐ์ด ๋ ์ดํ์ ๋ฐ์ดํฐ์ ๋ํด์๋ง ์๋ฆผ์ ์ฃผ๊ธฐ ๋๋ฌธ์ ์ด๊ธฐ ์ค์ ๊ฐ์ ๋ํด์ ์ ๋ฐ์ดํธ๋ฅผ ์ํํ์ง ๋ชปํ๋ค.
- ์ด ๊ฒฝ์ฐ์๋
behavierSubject
๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค. - ๊ฒฐ๊ตญ ์ํฉ์ ๋ฐ๋ผ ๋ฌธ์๋ฅผ ์๋ด์ผ ํ๋ค.
- ๋ ์ค์ํ ๊ฒ์ด tableview์ datasource๋ฅผ ํด์ ํ ์ํ๋ก ์ฌ์ฉํด์ผ ํ๋ค.
- ์ฝ๋๋ฅผ ๋์ผ๋ก ์ญ ํ์ผ๋ฉด์ ๊ฐ๋ณด๋ฉด ์๊ฐ๋ณด๋ค ๋ณ๊ฒ ์๋ค๋ ๊ฒ์ ์๊ฒ๋๋ค.
- ์๋๋ค. ์๋ฉด์์๋ก ์ด๋ ค์ ๋ค. ์ทจ์
MVC, MVP, MVVM
- ์์ฐจ์ ์ผ๋ก ๋ฐ๋ผ๊ฐ๋ฉด์ ์ฅ๋จ์ ์ ์์๋ณด์.
MVC
![imAssets/134312855-4b0658ff-90d7-4d21-bfd6-e68e099b18ff.png){: .center-small}MVC
- Model์์ View๋ฅผ ๋ฐ๋ก ์ ๋ฐ์ดํธ
- ๋น์ฆ๋์ค ๋ก์ง, action ์ฒ๋ฆฌ๋ฑ์ ๋ชจ๋ VC๊ฐ ๋ด๋นํ๊ธฐ ๋๋ฌธ์ ๊ต์ฅํ ์ปค์ง๋ค.
- ๊ทธ๋ ๊ฒ ๋๊ธฐ ๋๋ฌธ์ VC๊ฐ UIKit์ ์์๋ฐ๊ฒ ๋์ด ํ ์คํธํ๊ธฐ๊ฐ ์ด๋ ต๋ค.
- ๊ทธ๋ฌ๋ฉด ์ปจํธ๋กค๋ฌ์ ์ญํ ์ ์ข ์ ํํด๋ณด์.
MVP
![imAssets/134313110-06cabc28-4efa-4315-a01a-c7c4d5844a2c.png){: .center-small}MVP
- ์ฌ๊ธฐ์ ๋ณด๋ฉด VC๊ฐ View๋ฅผ ๋ชจ๋ ๋ด๋นํ๋ ๊ทธ๋ฆผ์ด๋ค.
- ๊ทธ๋ฆฌ๊ณ ์ปจํธ๋กค๋ฌ์ ๋ก์ง ๋ถ๋ถ์ ๋ด๋นํ๋ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ํ๋ ๋ง๋ค์.
- View๋ฅผ ๋ฉ์ฒญํ๊ฒ ๋ง๋ค๊ณ , ๋ก์ง ๋ด๋นํ๋ ๋ถ๋ถ์ ๋ฐ๋ก ๋นผ์.
- ์ผ๋จ ์ด๋ ๊ฒ ํ๋ฉด, Presenter๋ model์ ๊ฐ์ ๊ฐ๊ณตํ๊ณ , ๊ทธ๋ ค์ผ ํ๋ ๊ฐ์์ฒด๋ง ๋๊ฒจ๋ฒ๋ฆฐ๋ค.
- ์ด๋ฌ๋ฉด View๋ ๊ทธ๋ฆฌ๊ธฐ๋ง ํ๋ ์์๊ฐ ๋์ด๋ฒ๋ฆฌ๊ณ , Presenter์ ๋ก์ง์ ํ ์คํธํ ์ ์๊ฒ ๋๋ค.
- ๊ทธ๋ฐ๋ฐ ์ด๋ ๊ฒ ๋๋ฉด, Viewํ๊ณ (ํน์ VC) Presenter๊ฐ 1:1์ด ๋์ด์ผ ํ๋ค.
- ๊ทธ๋ฆฌ๊ณ ๊ฒฐ๊ตญ View์ ์ก์
์ด ๋ฐ์ํ ๊ฒฝ์ฐ์ Presenter๊ฐ ๋ฌด์์ ๊ทธ๋ ค์ผ ํ๋์ง ๋ค ๊ณ์ฐํด์ ์ผ์ผํ ์ง์๋ฅผ ๋ด๋ ค์ผ ํ๋ค.
- ์ง์๋ฅผ ๋ด๋ฆฐ๋ค๋ ๊ฒ์ ํน์ ๋ทฐ๋ฅผ ์ฐพ์์ ๊ทธ ์์ ํ๋กํผํฐ๋ฅผ ์ฐพ์์ ๊ฐ์ ์ ๋ฐ์ดํธ ํ๋ ๊ฒ์ ๋งํจ
- ๊ทธ๋ฆฌ๊ณ ๋ง์ฝ์ ๋๊ฐ์ ๊ฐ์ ๋ฐ์ํด์ผ ํ๋ ๊ฒฝ์ฐ์๋ View์ Presenter๊ฐ 1:1์ด์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ค๋ณต์ฝ๋๊ฐ ๋ฐ์ํจ
MVVM
![imAssets/134313189-54dcf074-154d-43ec-89a0-40a89781ac92.png){: .center-small}MVVM
- ๊ทธ๋์ View์ Model์ 1:๋ค ๊ด๊ณ๋ก ๋ง๋ค์ด๋ฒ๋ฆผ
- ์ฌ๊ธฐ์ ์กฐ์ฌํด์ผ ํ๋ ๊ฒ!
- json์ผ๋ก ๋ฐ์์ค๋ ๋ฐ์ดํฐ์ ๋ชจ๋ธ (์ฆ, json์ ํ์ฑํด์ ๋ง๋ค์ด์ง๋ ๋ชจ๋ธ)์ Domain Model์ด๋ผ ๋ถ๋ฅด๊ณ
- ์ค์ ํ๋ฉด์ ๋ณด์ฌ์ง model (์์ ๊ฒฝ์ฐ์๋ count, id ์ ๊ฐ์ ๋ค๋ฅธ ๋ณ์๊ฐ ํ์ํ์) ์ญ์ Viewmodel์ด๋ผ ๋ถ๋ฆ
- ์ด๊ฑด backend์ ์ํตํ๋๋ฐ ์์ด ๋ด๋ ค์ค๋ ๋ฐ์ดํฐ์ ์ค์ ๋ง๋ค๋ฉด์ ๋ณด์ฌ์ง ๋ชจ๋ธ์ ์ฐจ์ด๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋ฐ์ํจ
- ์ฌ๊ธฐ์๋ Architecture์ ์ธ ์ธก๋ฉด์์ ViewModel์ ๋งํจ
- ์ด๋ ๋ณด์ฌ์ง๋ ํ๋ฉด๊ณผ Model ์ฌ์ด์์ ๋ณด์ฌ์ง ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง ์ํ๋ก ์กด์ฌํ๋ ๊ฐ์ฒด๋ฅผ ๋งํจ
- ํต์ฌ์ View๊ฐ ๊ด์ฐฐ์ ํ๊ณ ์๋ค๊ฐ, ์๊ธฐ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ๊ฐ๋ ๊ฒ์
- ์ด๋ ๊ฒ ๋๋ฉด ๋ค๋ฅธ ๋ทฐ์์ ๊ฐ์ ๋ทฐ๋ชจ๋ธ์ ๋ฐ๋ผ๋ณด๊ณ ๋ณด์ฌ์ง๋ ๋ฐฉ๋ฒ์ ๋ฌ๋ฆฌํ ์ ์์
- ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ํ๋๋ ํ ์ด๋ธ๋ทฐ, ํ๋๋ ์ฌ๋ค์ผ๋ทฐ๋ก ๋ง๋ค์ ์๋ ๊ฒ๊ณผ ์ผ๋งฅ ์ํตํจ
์ฃผ์์ฌํญ ๋ฐ ํ
- ์์์ ์ฝ๋๋ฅผ ์ญ ๋ณด๋ฉด, Error๊ฐ ๋ฌ์ ๋, observable์ด ๋์ด์ง๋ค๊ณ ํ๋ค.
- ๊ทธ๋ ๋ค๋ฉด ๋ง์ฝ UI์ชฝ์์ ์ฐ๊ฒฐ์ ํด๋์๋๋ฐ (bind) ์๋ฌ๊ฐ ๋๋ฒ๋ฆฌ๋ฉด ์ด๋กํ ๊น?
- stream ์์ฒด๊ฐ ๋์ด์ ธ๋ฒ๋ ค์ ๋ค์ ๋์ (์๋ฅผ ๋ค์ด ๋ทฐ๋ฅผ ๋ฆฌ๋ก๋ํ๋)์ ํ๋๋ผ๋ ํ๋ฉด์ด ์ ๋ฐ์ดํธ ๋์ง ์์ ๊ฒ์ด๋ค.
- ๊ทธ๋์ ํต์ฌ์, UI์ชฝ์์ binding์ ๊ฑธ ๋๋ ์๋ฌ๊ฐ ๋๋๋ผ๋ ํด๋น ๋ฐ์ธ๋ฉ์ด ๋์ด์ง๊ฒ ํ๋ฉด ์๋๋ค.
- ๊ทธ๋์ ์๋์ ๊ฐ์ด ์ฌ์ฉํ๋ค.
- ์ด๋ ๊ฒ ์๋ฌ๋ ๊ฐ๋ฉด ๊ทธ๋ฅ ๋น ์คํธ๋ง์ ๋ฆฌํดํด๋ผ ์ ๊ฐ์ operator๊ฐ ์กด์ฌํ๋ค.
- ๊ทธ๋ฐ๋ฐ ์ ์๊ฐํด๋ณด๋ฉด, UI์์๋ ํญ์ ์ด ์ธ๊ฐ๋ฅผ ์ธํ
์ ํด์ค์ผ ํ๋ค.
catchErrorJustReturn
observeOn
bind
- ๊ทธ๋์ ๊ท์ฐฎ์์
driver
๋ผ๋ ๊ฒ์ ๋ง๋ค์๋ค. driver
๋ ํญ์ main thread์์ ๋์ํ๋ค.
- ๋์ด์ง์ง ์๋ bind๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ด๋ค.
- ์, ์ฌ๊ธฐ๊น์ง ๋ณด๋ฉด, ์? ๊ทธ๋ผ ์ ์ด์ ๋ฐํํ๋ ์ชฝ์์๋ Error๋ Complete ์์ฒด๊ฐ ํ์์๋ ๊ฑฐ์๋?
- ์ ์ด์ ๋ฐํํ ๋, onNext๋ง ์์ผ๋ฉด ์ ๋ฐ ์ฒ๋ฆฌ ์์ฒด๋ฅผ ์ํด์ค๋ ๋์์?
- ๊ทธ๋์ ๊ทธ๋ฐ๊ฒ ์๋ค. ๋์ด์ง์ง ์๋ Subject (Subject๋ ์ธ๋ถ์์ Observable์ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ ๊ฐ์ฒด๋ฅผ ๋งํจ)
RxRelay
- ์ด๋ฐ ์์ผ๋ก Reray๋ก ์ ์ธ์ ํด์ฃผ๊ณ , onNext๊ฐ ์๋๊ณ accept๋ผ๋ ๋ฉ์๋๋ก ๋ณ๊ฒฝํด์ฃผ๋ฉด ๋๋ค.
- ๋ค๋ฅธ ๋์์ ๋ชจ๋ ๊ฐ๋ค.
- ์ ์ด์ onNext๋ฐ์ ์๋ค. ์ค๋ก์ง ๊ฐ์ ๋ฐ์๋ค์ผ ์ ๋ฐ์ ์๋ค.
์ ๋ฆฌ
- MVVM ์ ๋ทฐ์ ๊ด๋ จ๋ ๊ฐ์ ๋ชจ์๋์ ๋ทฐ๋ชจ๋ธ์ ๋ง๋ค๊ณ , ์ด๋ฅผ View์์ ๊ฐ์ง๋ ๋ณํ๋ฅผ ์ ์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ค.
- MVVM์ ๊ตฌํํ๋๋ฐ ์์ด์ RxSwift๊ฐ ํ์์ ์ธ ๊ฒ์ ์๋๋ค. ๋ทฐ์ ๊ด๋ จ๋ ๋ชจ๋ธ์ ๋ง๋ค๊ณ , ๋ณํ๊ฐ ์ผ์ด๋ฌ์ ๋(didset) View๋ฅผ ์
๋ฐ์ดํธ๋ง ์์ผ์ค ์ ์๋ค๋ฉด MVVM์ ์ผ์ข
์ด๋ผ๊ณ ํ ์ ์๋ค.
- MVVM์ ๋ทฐ์์ ์ข ์์ฑ์ ์ต์ํ์ผ๋ก ๋ฎ์ถ์ด ํ ์คํธ๋ฅผ ํ๊ธฐ ์ฉ์ดํ ๊ตฌ์กฐ๋ก ๋ง๋ค๊ณ , ์ค๋ณต๋ ์ฝ๋๋ฅผ ์ค์ธ๋ค๋ ์ ์์ ์ข์ ๊ตฌ์กฐ์ด๋ค.
- ํ์ง๋ง ์ด๋ฌํ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋๋ฐ ์์ด์ data Binding์ ํ๋ค๋ฉด ๋ ๊ตฌ์กฐ์ ์ผ๋ก ๊น๋ํ๊ฒ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค.
- data binding์ด๋, Viewmodel์ ์๋ ๊ฐ์์ฒด์ View์ ๋ณํ๊ฐ ๋ฐ์ํ๋ ์์์ ์ฐ๊ฒฐ์ ์ํค๋ ๊ฒ์ ๋งํ๋ค.
- ์ด ๊ณผ์ ์์ KVO์ ๊ฐ์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์๋ ์์ ๊ฒ์ด๋ค.
- KVO๋ NSObject๋ฅผ ์์ํด์ ์ฒ๋ฆฌํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋ฌด๊ฑฐ์ด ํธ
- ์ด๋ฐ ์ํฉ์์ RxSwift๋ฅผ ์ฌ์ฉํ์ฌ ์ฒ๋ฆฌํ๋ค๋ฉด ์ข์ ๋ฐฉํธ์ด ๋ ์ ์๋ค.
- RxSwift๋ ๋น๋๊ธฐ ์ฒ๋ฆฌ์ ์์ด ํ์ ์ผ๋ก ๋ฆฌํด๋ฐ๊ธฐ ์ํ ์๋๋ก ๋ง๋ค์ด์ก์ง๋ง, ๋ฐ์ดํฐ ํ๋ฆ์ ์ฒ๋ฆฌํ๋๋ฐ ์ฉ์ดํ๊ธฐ ๋๋ฌธ์ด๋ค.
- ์ค์ ๋ก ๋ฐ์์ ์ฒ๋ฆฌํ๋ ๋ ์์ด ๊ตฌ๋ ์ ํ๊ณ , ํด๋น ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ๊ธฐ ๋๋ฌธ์ ๊ฐ์ ๊ด์ฐฐํ๋ ๋ก์ง์์ฒด๋ ์ ์ฌํ๋ค.
- ์ด ๋, ์ด๋ฅผ UI์ ์ฐ๊ฒฐํ๊ธฐ ์ํด์๋ RxCocoa ํ๋ ์ ์ํฌ์ RxRelay๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ฉด ๊ฐ๊ฒฐํ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค.
- Combine์ apple์ด ๋ง๋ ๋ฐ์ํ ํ๋ ์์ํฌ๋ผ๊ณ ์๊ฐํ๋ฉด ์ข๋ค.
- iOS 13์ดํ ๋ถํฐ ์ ์ฉ์ด ๋๊ธฐ ๋๋ฌธ์, ํ์ฌ๋ก์๋ ์์ง ์ ์ฉํ๊ธฐ๊ฐ ์กฐ๊ธ ์ด๋ ค์ด ์ํ์ด๋ค.
- ํ์ง๋ง 1๋ ์ ๋ ์ฌ์ด์ ์๊ฐ๋ด์์ ์ฌ์ฉํ ๊ฐ๋ฅ์ฑ์ด ๋๊ธฐ ๋๋ฌธ์, ํ์ฌ๋ RxSwift๋ก ๊ฐ๋ฐ์ ์งํํด๋ณด๊ณ , ๋์ค์ Combine์ผ๋ก ๋ณ๊ฒฝํ๋ ์ฐ์ต์ ํ๋ ๊ฒ์ด ์ข์๋ณด์ธ๋ค.
- ๊ทธ๋ฆฌ๊ณ Combine๊ณผ SwiftUI๊ฐ์ ํ์ฉ๋๊ฐ ์ข๊ธฐ ๋๋ฌธ์, ์ด๋ฅผ ๋์ค์ ์ฐ์ตํด์ผ ํ๋ค.
- Flutter๋ ์ถ๊ฐ๋ก.. ํ ํ ๊ฒ ๋ง๋ค.