ํฐ์คํ ๋ฆฌ ๋ทฐ
[RxSwift] #3) RxSwift + MVVMํจํด [๊ธฐ๋ณธ ํ๋ก์ ํธ ๊ตฌ์ฑ]
ir.__.si 2023. 1. 29. 06:12๋ณธ ํฌ์คํ ์ ๊ณฐํ๊น๋์ ๊ฐ์์์์ ๊ธฐ๋ฐ์ผ๋ก, ๊ฐ์ธ์ ์ผ๋ก ๊ณต๋ถํ ๋ด์ฉ์ ์ ๋ฆฌํ ๊ธ์ ๋๋ค.
๋์ฑ ์์ธํ ๋ด์ฉ์, ๊ฐ์ ์์์ ์ง์ ์์ฒญํ์๋๊ฒ์ ์ถ์ฒ๋๋ฆฝ๋๋ค!
1. ํ๋ก์ ํธ๋ฅผ MVVM ํจํด์ผ๋ก ๊ตฌ์ฑํ๊ธฐ
๊ฐ๋จํ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์, RxSwfit์ ์ค์ ์ ์ฉ์ฌํญ์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
์ฐ์ ํด๋น ํ๋ก์ ํธ๋ MVVMํจํด์ ๊ธฐ๋ฐ์ผ๋ก ์์ฑ๋๋ ํ๋ก์ ํธ์ ๋๋ค.
์งํํ ํ๋ก์ ํธ์ ๊ธฐ๋ณธ ํด๋๊ตฌ์กฐ์, View ํ๋ฉด์ ์๋์ ๊ฐ์ต๋๋ค.
1) Model : APIService๋ก ๋ฐ์์ฌ rawData ๊ตฌ์กฐ ํ์ผ
2) APIService : Menu์ Model๋ก fetching ํด์ค๋ API๊ฐ URLSession์ผ๋ก ์์ฑ ๋์ด์์
3) MenuViewController : tabelView๋ก ๊ตฌ์ฑ๋ ํ ํ๋ฉด ViewController
4) MenuItemTableViewCell : MenuViewController์ ํ ์ด๋ธ ๋ทฐ์ cell ์ ๋ณด
5) OrderViewController : ํ์์ ORDER๋ฅผ ๋๋ฅด๋ฉด ๋์ค๋ ViewController
๋ฉ์ธํ๋ฉด์ ๋ด๋นํ๋ MenuViewController๋ฅผ ์ดํด๋ณด๋ฉด, ์ค์ ๋ก View ํํ์ ์ํ ์์๋ name / price / count๊ฐ ์์ต๋๋ค.
๋ฐ๋ผ์, View๋ฅผ ์ํ Model์ธ 'Menu' ๋ผ๋ ViewModelํ์ผ์ ๋ฐ๋ก ๋ง๋ค์ด์ค๋๋ค.
Array<Menu>ํ์ ์ menus๋ผ๋ ๋ณ์๋ฅผ ๋ง๋ค๊ณ , ๋๋ฏธ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด ์ค๋๋ค.
๊ทธ๋ฆฌ๊ณ , tableView์ [numberOfRowsInSection] / [cellForRowAt]๋ฅผ ๊ฐ๊ฐ ์ค์ ํด์ค๋๋ค.
์๋๋, ํด๋น์ฝ๋๋ฅผ ์คํ์ํจ MenuViewController์ ํ๋ฉด์ ๋๋ค.
์ด๋, 'menus'๋ผ๋ ๋๋ฏธ๋ฐ์ดํฐ๋ ViewController๊ฐ ๊ฐ์ง๊ณ ์๊ธฐ์๋ ๋๋ฌด ViewController๊ฐ Massiveํด์ง๋ฏ๋ก
๋ฐ๋ก 'MenuListViewModel'๋ผ๋ ์ด๋ฆ์ ํ์ผ๋ก ๋ง๋ค์ด์ค๋๋ค.
๊ทธ๋ฆฌ๊ณ , MenuViewController์ viewModel ์ด๋ผ๋ ๋ณ์๋ฅผ ๋ง๋ค์ด์ฃผ๊ณ , type์ MenuListViewModel๋ก ๋ง๋ค์ด์ค๋๋ค.
์ด์ ์ ์ค์ ํด์ฃผ์๋ [numberOfRowsInSection] / [cellForRowAt] ๋ํ viewModel๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ค์ ํด์ค๋๋ค.
์ด๋ ๊ฒ ํ๋ฉด ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ MVVM๊ตฌ์กฐ์ ํ๋ก์ ํธ๊ฐ ๋ง๋ค์ด์ก์ต๋๋ค.
์ด์ ๋ณธ๊ฒฉ์ ์ผ๋ก RxSwift๋ฅผ ์ ์ฉํด๋ด ์๋ค.
2. RxSwift ์ ์ฉํ๊ธฐ
์ฐ์ , MenuViewController์ RxSwift์ RxCocoa๋ฅผ import์์ผ์ค๋๋ค.
-> ์ด๋ RxCocoa๋ ๊ธฐ์กด์ cocoa pod์ Rx๊ธฐ๋ฅ์ Extension ํด์ค ๊ฒ์ผ๋ก ์๊ฐํ๋ฉด ๋ฉ๋๋ค.
์ฐ์ , MenuViewController์ ์ฐ๋ฆฌ๊ฐ ๋ณด์ฌ์ค์ผ ํ ๋ฐ์ดํฐ๊ฐ ๋ ์๋์ง๋ฅผ ์ฐพ์๋ณด๋,
๋ด์ ์์ดํ ์ ๊ฐฏ์์ / ๋ด์ ์์ดํ ๋ค์ ์ด ๊ฐ๊ฒฉ์ ๋ณด์ฌ์ค์ผ ํ๋ค๋ ์ฌ์ค์ ์ ์ ์์์ต๋๋ค.
๋ฐ๋ผ์, View์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํ Model์ธ ViewModel์ ๋ด์ฉ์ ์์ ํด์ฃผ๊ณ , View์ Label์๋ ํด๋น ๊ฐ์ ๋ฃ์ด์ฃผ์์ต๋๋ค.
๋ณธ๊ฒฉ์ ์ผ๋ก RxSwift๋ฅผ ์ฌ์ฉํ์ฌ ORDER์ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ ์,
Testํ๋ ์ฐจ์์์ 'ORDER๋ฒํผ์ ๋๋ฅด๋ฉด totalPrice์ ๊ฐ๊ฒฉ์ด 100์์ฉ ์ฆ๊ฐํ๊ณ , ๊ทธ๊ฒ์ด ์ค์ Label์๋ ํํ'๋๊ฒ ํด๋ณด๊ฒ ์ต๋๋ค.
๋น์ฐํ๊ฒ๋ ์ด๋ ๊ฒ๋ง ์์ฑ์ ํ๋ฉด, ์ค์ UI๋ณ๊ฒฝ์ ์ด๋ค์ง์ง ์์ต๋๋ค...
์ด์ ๋ ๋ค ์์๊ฒ ์ง๋ง, ๋ณํ๋๋ ๊ฐ์ ๋ฐ๋ผ์ UI๋ฅผ ์๋ก ๊ทธ๋ ค์ฃผ๋ ์์ ์ด ํจ๊ป ์ด๋ค์ง๊ณ ์์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๊ทธ๋ ๋ค๋ฉด UI๋ณ๊ฒฝ ์ฝ๋๋ฅผ ์ onOrder()์ ์์ฑํ๋ฉด UI๋ณ๊ฒฝ์ด ์ด๋ค์ง์ง ์์๊น์????
์ด๋ ๊ฒ UI๋์๊น์ง ์ด๋ค์ง๊ฒ ํด ์ฃผ์์ต๋๋ค.
๊ทธ๋ฐ๋ฐ, ์ง๊ธ ์์ฑ๋ ๋ฐฉ์์ '๊ฐ์ด ๋ณ๊ฒฝ ๋ ๋ ๋ง๋ค ์ฐ๋ฆฌ๊ฐ updateUI๋ผ๋ ํจ์๋ฅผ ํธ์ถํ๋ฉด์ label์ ๊ฐ์ ์ง์ ๋ฐ๊ฟ์ฃผ๋ ํํ'์ ๋๋ค.
๊ฐ์ ๋ณ๊ฒฝ์ด ๊ฐ์ง๋๋ฉด, ์๋์ผ๋ก value์ UI๊ฐ ๋ณ๊ฒฝ๋๊ฒ ํ ์๋ ์์๊น์????
๋น์ฐํ ๊ฐ๋ฅํ๊ณ , ์ฐ๋ฆฌ๋ ์ด๊ฒ์ ์ํด RxSwift๋ฅผ ์ฌ์ฉํฉ๋๋ค!
์ฐ์ MenuListViewModel์ ์ ์๋์ด์๋ 'totalPrice'๋ฅผ Observableํ์ ์ผ๋ก ์์ ํด์ค์๋ค.
๊ทธ๋ฆฌ๊ณ , updateUI()์์ 'totalPrice.text = viewModel.totalPrice.currencyKR()' ๋ถ๋ถ์ ์ฃผ์ ์ฒ๋ฆฌํด์ฃผ๊ณ
viewDidLoad()์์ 'viewModel.totalPrice'๋ฅผ subscribe ํด์ค๋๋ค.
์คํ์ ํด๋ณด๋ฉด, ์์๊ฐ์ด ์ํ๋ ๋๋ก ์ด๊ธฐ๊ฐ์ด ์ ์ค์ ๋์ด ์๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
ํ์ง๋ง ์ง๊ธ ์ํ์์ ORDER๋ฒํผ์ ๋๋ฅธ๋ค๊ณ ํด๋ value๊ฐ ๋ณ๋ ๋์ง๋ ์๊ณ , UI๊ฐ ๋ฐ๋์ง๋ ์์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด๋ป๊ฒ ORDER๋ฅผ ๋๋ฌ์ 100์์ด ์ถ๊ฐ๊ฐ ๋ ๋ ๋ง๋ค Label๋ ๋ฐ๋๊ฒ Observable์ ์ฌ์ฉํ ์ ์์๊น์??
์ด๋ฏธ ์ฐ๋ฆฌ๊ฐ ๋ง๋ totalPrice๋ .just๋ฅผ ํตํด ํ๋์ Stream์ผ๋ก ๋ง๋ค์ด์ ธ ๋ฒ๋ฆฐ์ํฉ์ธ๋ฐ
์ด๋ป๊ฒ ์ดํ์ ๊ฐ์ ๊ด์ฌํ ์ ์์๊น์?
์ฌ๋๋ค์ ์ด๋ฌํ ๊ณ ๋ฏผ๋ค ๋์,
Observable์ ์ญํ ๊ณผ Observer์ ์ญํ ์ ๋ชจ๋ ํ ์ ์๋ Subject ๋ผ๋ ๊ฒ์ ๋ง๋ค์ด ์ฌ์ฉํ์์ต๋๋ค.
์ฆ, ์ด๋ฒคํธ๋ฅผ ๋ฐ์(.emit)ํ ์๋ ์๊ณ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌ(.subscribe)ํ ์๋ ์๋ ๊ฒ ์ ๋๋ค.
์ด์ ๊ฐ์ ํน์ฑ์ ์ด์ฉํ์ฌ, View์์ User์ Input์ viewModel์ Subject๊ฐ ๊ตฌ๋ (.subscribe)ํ๊ณ ,
๊ตฌ๋ ์ ํตํด ๋ฐํ๋ ๊ฐ(.emit)์ ๋ฐํ์ผ๋ก viewModel์์ ๊ฐ๊ณต๋ ๋ฐ์ดํฐ๋ฅผ View๊ฐ ๊ตฌ๋ (.subscribe)ํ ์ ์์ต๋๋ค.
.
.
.
.
์์ธํ ์ฌ์ฉ๋ฒ์ ๋ค์ ํฌ์คํ ์์ ๊ณ์ ์ด์ด๊ฐ๊ฒ ์ต๋๋ค.
'๐ > RxSwift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[RxSwift] #6) RxSwift + MVVMํจํด [RxCocoa๋ฅผ ํ์ฉํ UITableView ๊ตฌ์ฑ] (2) | 2023.02.01 |
---|---|
[RxSwift] #5) RxSwift + MVVMํจํด [Subject๋ฅผ ํ์ฉํด๋ณด์] (0) | 2023.01.30 |
[RxSwift] #4) Subject๋ ๋ฌด์์ผ๊น? (1) | 2023.01.29 |
[RxSwift] #2) Operator๋?? + ReactiveX ๋ฌธ์๋ณด๋ ๋ฒ (2) | 2023.01.28 |
[RxSwift] #1) RxSwift ๊ฐ๋ ์ก๊ธฐ (๋ฑ์ฅ ๋ฐฐ๊ฒฝ + ๊ธฐ๋ณธ ๊ตฌ์กฐ) (0) | 2023.01.26 |