๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐ŸŽ iOS

iOS์—์„œ MVC์™€ MVVM ๊ฐ„๋‹จํžˆ ์‚ดํŽด๋ณด๊ธฐ

by ํ‹ด๋”” 2020. 10. 12.
728x90
๋ฐ˜์‘ํ˜•

์ฐธ๊ณ  ์‚ฌ์ดํŠธ ๐Ÿ‘‡

 

iOS MVVM Tutorial: Refactoring from MVC

In this iOS tutorial, you’ll learn how to convert an MVC app into MVVM. In addition, you’ll learn about the components and advantages of using MVVM.

www.raywenderlich.com

ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜๋‹ค๋ณด๋ฉด ์–ด๋–ป๊ฒŒ ์˜์กด์„ฑ์„ ์ค„์ด๊ณ  ๊ฐ ํŠน์ง•์— ๋งž๊ฒŒ ํด๋ž˜์Šค๋ฅผ ๋ถ„๋ฆฌํ•˜๋ฉฐ ๋ณต์žกํ•˜๊ณ  ๋‚œ์žกํ•œ ์ฝ”๋“œ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋ ค๋Š” ๋…ธ๋ ฅ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์›น ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ๋Š” MVC๋ฅผ ๋ฐฐ์šฐ๊ฒŒ ๋˜๋Š”๋ฐ ์ด๋•Œ M์€ model์˜ ์•ฝ์ž๋กœ ๋ฐ์ดํ„ฐ์˜ ๋ชจ์Œ์ด๋‚˜ ๋ฐ์ดํ„ฐ ํด๋ž˜์Šค, ๋ฐ์ดํ„ฐ ๊ฐ์ฒด ๋“ฑ์„ ์˜๋ฏธํ•œ๋‹ค. V๋Š” view์˜ ์•ฝ์ž๋กœ์„œ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ง€๋Š” ํ™”๋ฉด์„ ๋งํ•˜๋Š”๋ฐ, ์ž…๋ ฅ์„ ๋ฐ›์•„ controller๋กœ ๋ณด๋‚ด๊ฑฐ๋‚˜ model์—์„œ controller ์„ ๊ฑฐ์นœ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹จ์ˆœํžˆ ๋ณด์—ฌ์ค€๋‹ค. ์ด๋•Œ Model ๊ณผ View ์‚ฌ์ด์—์„œ ์ƒํ˜ธ์ž‘์šฉ์„ ํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด Controller์˜ ์—ญํ™œ์ด๋‹ค. 

 

iOS ๋˜ํ•œ ์œ ์ง€๋ณด์ˆ˜์™€ ๋‹จ์œ„ํ…Œ์ŠคํŠธ, ๋ณต์žก์„ฑ์„ ๋‚ฎ์ถ”๊ธฐ ์œ„ํ•ด MVC์™€ ๊ฐ™์€ ์•„ํ‚คํ…์ฒ˜ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœํ•˜๊ณ  ์žˆ๋‹ค. MVC ์•„ํ‚คํ…์ฒ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ view์—์„œ ์ง์ ‘์ ์œผ๋กœ model์— ์ ‘๊ทผํ•˜์ง€ ์•Š์•„๋„ ๋˜๋ฏ€๋กœ ๋ทฐ์™€ ๋ชจ๋ธ์ด ๋…๋ฆฝ๋˜์–ด ์ปจํŠธ๋กค๋Ÿฌ์— ์˜ํ•ด ์—ฐ๊ฒฐ๋œ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Ÿฐ MVC๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ Controller์˜ ์—ญํ™œ์ด ์ปค์ ธ ์ฝ”๋“œ๋Ÿ‰์ด ๋งŽ์•„์ง€๋Š” ๋‹จ์ ์„ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด MVVM ํŒจํ„ด ๋ชจ๋ธ์ด ์ž์ฃผ ์–ธ๊ธ‰๋˜๊ณ  ์žˆ๋‹ค. 

 

MVVM์€ Model, View, ViewModel 3๊ณ„์ธต์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.

 

Model : ์•ฑ์„ ์ž‘๋™์‹œํ‚ค๋Š” ์•ฑ ๋ฐ์ดํ„ฐ๋กœ์„œ ํ™”๋ฉด์— ๋ณด์—ฌ์ค„ ์ •๋ณด ๋“ฑ ํฌํ•จ๋œ๋‹ค.

View :  ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค์˜ ์‹œ๊ฐ์ ์ธ ์š”์†Œ์ด๋‹ค. iOS์—์„œ๋Š” ๋ทฐ์™€ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์™„์ „ํžˆ ๋ถ„๋ฆฌ์‹œํ‚ฌ ์ˆ˜ ์—†๋Š” ๊ด€๊ณ„์ด๊ธฐ ๋•Œ๋ฌธ์— view์•ˆ์— view controller์™€ view๋ฅผ ํ•จ๊ป˜ ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค. 

View Model : ๋ทฐ์—์„œ ์‚ฌ์šฉ์ž๋‚˜ ํ˜น์€ ๋‹ค๋ฅธ ์ด์œ ๋กœ ๊ฐ’์ด ์—…๋ฐ์ดํŠธ ๋˜๋ฉด model์„ ์—…๋ฐ์ดํŠธ ์‹œํ‚ค๋ฉฐ, ๋ชจ๋ธ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ทฐ์— ์—…๋ฐ์ดํŠธ ์‹œํ‚ค๋Š” ์—ญํ™œ์„ ํ•œ๋‹ค. 

 

๊ธฐ์กด์˜ ์•„ํ‚คํ…์ณ์™€ ์กฐ๊ธˆ ๋” ์ฃผ๋ชฉํ•ด์•ผ ํ•  ๋ถ€๋ถ„์ด ์žˆ๋‹ค๋ฉด View Model ์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ์–ด์ฐŒ๋ณด๋ฉด ๊ธฐ์กด์˜ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ViewController์˜ ์—ญํ™œ๊ณผ ํฌ๊ฒŒ ๋‹ฌ๋ผ๋ณด์ด์ง€ ์•Š์ง€๋งŒ View Model์€ UIKit์€ ViewController๊ฐ€ ๊ทธ ์™ธ ์„œ๋น„์Šค๋‚˜ Model์— ๋Œ€ํ•œ ์กฐ์ž‘์€ View Model์ด ์ˆ˜ํ–‰ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ViewController๋Š” view model์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ทฐ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜๋ฉฐ  MVC์— ๋น„ํ•ด ViewController์˜ ์ฝ”๋“œ ๊ธธ์ด๊ฐ€ ๊ฐ„๋‹จํ•ด์ง€๋Š” ์žฅ์ ์ด ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์—๋„ ViewModel์ด ๋ฌด๊ฑฐ์›Œ์ง€๋Š” ๋‹จ์  ๋“ฑ์ด ์žˆ๋‹ค. 

 

ViewModel์€ Model๊ณผ service์— ์ ‘๊ทผํ•˜์—ฌ ๊ฐ’์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ view controller ๋Š” view model์„ ํ†ตํ•ด view์— ์žˆ๋Š” ๊ฐ’๋“ค์„ ๋ฐ”์ธ๋”ฉ ํ•˜๋ฏ€๋กœ ์–ด๋–ป๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”์ธ๋”ฉ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•ด ์ƒ๊ฐํ•ด ๋ณผ ํ•„์š”๊ฐ€ ์žˆ๋‹ค. 

 

์—ฌ๊ธฐ์—๋Š” key-value Observing (KVO) , FRP (Functional apple programming. ex - RxSwift, ReactiveSwift..), Delegation, Boxing ๋“ฑ์ด ์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ Boxing์€ ๊ฐ’์˜ ๋ณ€๊ฒฝ์„ ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•ด ์˜ต์ €๋ฒ„ ํŒจํ„ด ํ˜•์‹์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. 

 

 

์ด์ƒํ•œ ๋‚ด์šฉ์ด๋‚˜ ์ž˜๋ชป๋œ ๊ฒƒ์ด ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€๋กœ ์•Œ๋ ค์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค!!

728x90
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€