ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

728x90
๋ฐ˜์‘ํ˜•

๋ณธ ํฌ์ŠคํŒ…์€ ๊ณฐํŠ€๊น€๋‹˜์˜ ๊ฐ•์˜์˜์ƒ์„ ๊ธฐ๋ฐ˜์œผ๋กœ, ๊ฐœ์ธ์ ์œผ๋กœ ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.

๋”์šฑ ์ž์„ธํ•œ ๋‚ด์šฉ์€, ๊ฐ•์˜ ์˜์ƒ์„ ์ง์ ‘ ์‹œ์ฒญํ•˜์‹œ๋Š”๊ฒƒ์„ ์ถ”์ฒœ๋“œ๋ฆฝ๋‹ˆ๋‹ค! 

 

 


1. ํ”„๋กœ์ ํŠธ๋ฅผ MVVM ํŒจํ„ด์œผ๋กœ ๊ตฌ์„ฑํ•˜๊ธฐ

 

 

 

๊ฐ„๋‹จํ•œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ, RxSwfit์˜ ์‹ค์ œ ์ ์šฉ์‚ฌํ•ญ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์šฐ์„  ํ•ด๋‹น ํ”„๋กœ์ ํŠธ๋Š” MVVMํŒจํ„ด์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘์„ฑ๋˜๋Š” ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค.

 

์ง„ํ–‰ํ•  ํ”„๋กœ์ ํŠธ์˜ ๊ธฐ๋ณธ ํด๋”๊ตฌ์กฐ์™€, View ํ™”๋ฉด์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํด๋” ๊ตฌ์กฐ / MenuViewController ํ™”๋ฉด / OrderViewController ํ™”๋ฉด

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๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

์‹ค์ œ MenuViewController์— ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ๋ชจ๋ธ

๋”ฐ๋ผ์„œ, View๋ฅผ ์œ„ํ•œ Model์ธ 'Menu' ๋ผ๋Š” ViewModelํŒŒ์ผ์„ ๋”ฐ๋กœ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.

 

 

 

numberOfRowsInSection์— menus.count๋ฅผ ์„ค์ •ํ•˜๊ณ  / cellForRowAt์—์„œ ๊ฐ cell์˜ Label๊ฐ’์„ ์„ค์ • ํ•ด์ค€๋‹ค.

Array<Menu>ํƒ€์ž…์˜ menus๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค๊ณ , ๋”๋ฏธ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์–ด ์ค๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ , tableView์˜ [numberOfRowsInSection] / [cellForRowAt]๋ฅผ ๊ฐ๊ฐ ์„ค์ • ํ•ด์ค๋‹ˆ๋‹ค.

 

 

์•„๋ž˜๋Š”, ํ•ด๋‹น์ฝ”๋“œ๋ฅผ ์‹คํ–‰์‹œํ‚จ MenuViewController์˜ ํ™”๋ฉด์ž…๋‹ˆ๋‹ค.

๋”๋ฏธ๋ฐ์ดํ„ฐ๋กœ ์‹คํ–‰์‹œํ‚จ ํ™”๋ฉด.

 

 

 

 

menus๋ผ๋Š” ๋ฐ์ดํ„ฐ๋“ค์„ ๋”ฐ๋กœ, MenuListViewModel์ด๋ผ๋Š” ํŒŒ์ผ๋กœ ๋นผ์คŒ

์ด๋•Œ,  'menus'๋ผ๋Š” ๋”๋ฏธ๋ฐ์ดํ„ฐ๋Š” ViewController๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ์—๋Š” ๋„ˆ๋ฌด ViewController๊ฐ€ Massiveํ•ด์ง€๋ฏ€๋กœ 

๋”ฐ๋กœ 'MenuListViewModel'๋ผ๋Š” ์ด๋ฆ„์˜ ํŒŒ์ผ๋กœ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.

 

 

 

 

MenuListViewModelํƒ€์ž…์˜ ๋ณ€์ˆ˜ viewModel์„ ์ƒ์„ฑํ•ด์ค€๋‹ค.

๊ทธ๋ฆฌ๊ณ , MenuViewController์— viewModel ์ด๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๊ณ , type์„ MenuListViewModel๋กœ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.

 

 

 

 

viewModel์˜ ๋ฉค๋ฒ„๋ณ€์ˆ˜์ธ menus๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ, ๊ฐ’์„ ์žฌ์„ค์ • ํ•ด์ค€๋‹ค.

์ด์ „์— ์„ค์ • ํ•ด์ฃผ์—ˆ๋˜ [numberOfRowsInSection] / [cellForRowAt] ๋˜ํ•œ viewModel๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์žฌ์„ค์ • ํ•ด์ค๋‹ˆ๋‹ค.

 

 

 

 

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ MVVM๊ตฌ์กฐ์˜ ํ”„๋กœ์ ํŠธ๊ฐ€ ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค.

์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ RxSwift๋ฅผ ์ ์šฉํ•ด๋ด…์‹œ๋‹ค. 

 

 

 


2. RxSwift ์ ์šฉํ•˜๊ธฐ

 

 

RxSwift / RxCocoa๋ฅผ import ํ•ด์ค€๋‹ค.

์šฐ์„ , MenuViewController์— RxSwift์™€ RxCocoa๋ฅผ import์‹œ์ผœ์ค๋‹ˆ๋‹ค.

-> ์ด๋•Œ RxCocoa๋ž€ ๊ธฐ์กด์˜ cocoa pod์— Rx๊ธฐ๋Šฅ์„ Extension ํ•ด์ค€ ๊ฒƒ์œผ๋กœ ์ƒ๊ฐํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

 

 

๋ช‡ ๊ฐœ๋ฅผ ๋‹ด์•˜๋Š”์ง€๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” Items / ์ด ์–ผ๋งˆ์ธ์ง€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” totalPrice

์šฐ์„ , MenuViewController์— ์šฐ๋ฆฌ๊ฐ€ ๋ณด์—ฌ์ค˜์•ผ ํ•  ๋ฐ์ดํ„ฐ๊ฐ€ ๋” ์—†๋Š”์ง€๋ฅผ ์ฐพ์•„๋ณด๋‹ˆ,

๋‹ด์€ ์•„์ดํ…œ์˜ ๊ฐฏ์ˆ˜์™€ / ๋‹ด์€ ์•„์ดํ…œ๋“ค์˜ ์ด ๊ฐ€๊ฒฉ์„ ๋ณด์—ฌ์ค˜์•ผ ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

 

 

 

MenuListViewModel์— itemCount & totalPrice๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ์ƒ์„ฑํ•ด์ฃผ์—ˆ๋‹ค / ์‹ค์ œ View์— ๋‚˜ํƒ€๋‚˜๋Š” Label์— ํ•ด๋‹น ๊ฐ’์„ ๋„ฃ์–ด์ฃผ์—ˆ๋‹ค.

๋”ฐ๋ผ์„œ, View์— ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•œ Model์ธ ViewModel์˜ ๋‚ด์šฉ์„ ์ˆ˜์ • ํ•ด์ฃผ๊ณ , View์˜ Label์—๋„ ํ•ด๋‹น ๊ฐ’์„ ๋„ฃ์–ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

 

 

 

 

๋ณธ๊ฒฉ์ ์œผ๋กœ RxSwift๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ORDER์˜ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์ „์—,

Testํ•˜๋Š” ์ฐจ์›์—์„œ 'ORDER๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด totalPrice์˜ ๊ฐ€๊ฒฉ์ด 100์›์”ฉ ์ฆ๊ฐ€ํ•˜๊ณ , ๊ทธ๊ฒƒ์ด ์‹ค์ œ Label์—๋„ ํ‘œํ˜„'๋˜๊ฒŒ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

์ด๋ ‡๊ฒŒ ๊ฐ’์„ ๋ณ€๊ฒฝํ•ด์ฃผ๋ฉด, ๊ณผ์—ฐ ์‹ค์ œ View์— ๋ณด์ด๋Š” Label์—๋„ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋Š”๊ฒƒ์ด ๋ณด์ผ๊นŒ??

๋‹น์—ฐํ•˜๊ฒŒ๋„ ์ด๋ ‡๊ฒŒ๋งŒ ์ž‘์„ฑ์„ ํ•˜๋ฉด, ์‹ค์ œ UI๋ณ€๊ฒฝ์€ ์ด๋ค„์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค...

์ด์œ ๋Š” ๋‹ค ์•„์‹œ๊ฒ ์ง€๋งŒ, ๋ณ€ํ™”๋˜๋Š” ๊ฐ’์— ๋”ฐ๋ผ์„œ UI๋ฅผ ์ƒˆ๋กœ ๊ทธ๋ ค์ฃผ๋Š” ์ž‘์—…์ด ํ•จ๊ป˜ ์ด๋ค„์ง€๊ณ ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด UI๋ณ€๊ฒฝ ์ฝ”๋“œ๋ฅผ ์ € onOrder()์— ์ž‘์„ฑํ•˜๋ฉด UI๋ณ€๊ฒฝ์ด ์ด๋ค„์ง€์ง€ ์•Š์„๊นŒ์š”????

 

 

 

๊ณผ์—ฐ ์ด๋ฒˆ์—๋Š” ์ƒ๊ฐ๋Œ€๋กœ ์ž˜ ์‹คํ–‰์ด ๋ ๊นŒ????

๋‹น์—ฐํžˆ ์ž˜ ๋™์ž‘ํ•œ๋‹ค!

์ด๋ ‡๊ฒŒ UI๋™์ž‘๊นŒ์ง€ ์ด๋ค„์ง€๊ฒŒ ํ•ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ, ์ง€๊ธˆ ์ž‘์„ฑ๋œ ๋ฐฉ์‹์€ '๊ฐ’์ด ๋ณ€๊ฒฝ ๋  ๋•Œ ๋งˆ๋‹ค ์šฐ๋ฆฌ๊ฐ€ updateUI๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด์„œ label์˜ ๊ฐ’์„ ์ง์ ‘ ๋ฐ”๊ฟ”์ฃผ๋Š” ํ˜•ํƒœ'์ž…๋‹ˆ๋‹ค.

๊ฐ’์˜ ๋ณ€๊ฒฝ์ด ๊ฐ์ง€๋˜๋ฉด, ์ž๋™์œผ๋กœ value์™€ UI๊ฐ€ ๋ณ€๊ฒฝ๋˜๊ฒŒ ํ•  ์ˆ˜๋Š” ์—†์„๊นŒ์š”????

 

 

๋‹น์—ฐํžˆ ๊ฐ€๋Šฅํ•˜๊ณ , ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์„ ์œ„ํ•ด RxSwift๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค!

 

 

 

Observable<Int>ํƒ€์ž…์œผ๋กœ ์žฌ์ •์˜

์šฐ์„  MenuListViewModel์— ์ •์˜๋˜์–ด์žˆ๋Š” 'totalPrice'๋ฅผ Observableํƒ€์ž…์œผ๋กœ ์ˆ˜์ •ํ•ด์ค์‹œ๋‹ค.

 

 

operator๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ, ์ ์ ˆํ•˜๊ฒŒ ๊ฐ’์„ ๋ณ€ํ™˜ํ•˜๊ณ  onNext๋ฅผ ํ†ตํ•ด ๋ฐฉ์ถœํ•œ๋‹ค. / DisposeBag()์€ ๋ฏธ๋ฆฌ ์„ค์ • ํ•ด๋‘๊ธฐ.

๊ทธ๋ฆฌ๊ณ , updateUI()์—์„œ 'totalPrice.text = viewModel.totalPrice.currencyKR()' ๋ถ€๋ถ„์„ ์ฃผ์„ ์ฒ˜๋ฆฌํ•ด์ฃผ๊ณ 

viewDidLoad()์—์„œ 'viewModel.totalPrice'๋ฅผ subscribe ํ•ด์ค๋‹ˆ๋‹ค.

 

 

 

MenuViewController initํ™”๋ฉด

์‹คํ–‰์„ ํ•ด๋ณด๋ฉด, ์œ„์™€๊ฐ™์ด ์›ํ•˜๋Š” ๋Œ€๋กœ ์ดˆ๊ธฐ๊ฐ’์ด ์ž˜ ์„ค์ •๋˜์–ด ์žˆ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ง€๊ธˆ ์ƒํƒœ์—์„œ 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)ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

.

.

.

.

์ž์„ธํ•œ ์‚ฌ์šฉ๋ฒ•์€ ๋‹ค์Œ ํฌ์ŠคํŒ…์—์„œ ๊ณ„์† ์ด์–ด๊ฐ€๊ฒ ์Šต๋‹ˆ๋‹ค.

728x90
๋ฐ˜์‘ํ˜•
๋Œ“๊ธ€
๋ฐ˜์‘ํ˜•
๋งํฌ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
Total
Today
Yesterday