๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐ŸŽ iOS/Architecture

[Architecture] MVC, MVP, MVVM ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด

์•ˆ๋…•ํ•˜์„ธ์š”๐Ÿ˜Š ์˜ค๋Š˜์€ ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด ๋ช‡๊ฐ€์ง€์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด๋ณผ๊นŒ ํ•ฉ๋‹ˆ๋‹ค!

์•„ํ‚คํ…์ฒ˜์— ๋Œ€ํ•ด ๊ณต๋ถ€ํ•ด์•ผ๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ•œ ์ด์œ ๋Š” MVC ํŒจํ„ด์œผ๋กœ ๊ฐœ๋ฐœํ•˜๋ฉฐ

VC๊ฐ€ ๋ชจ๋“  ์—ญํ• ์„ ๋‹ด๋‹นํ•˜๋‹ค๋ณด๋‹ˆ ์ ์  ๋ฌด๊ฑฐ์›Œ์ง€๋Š” ๊ฒƒ์„ ๋Š๊ผˆ๊ณ ..

์ด๋Ÿฌํ•œ MVC ํŒจํ„ด์˜ ๋‹จ์ ์— ๋Œ€ํ•œ ๋Œ€์•ˆ์œผ๋กœ MVVM ํŒจํ„ด์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ MVC, MVP, MVVM ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด์— ๋Œ€ํ•ด ์ฐจ์ด์ ์„ ์œ„์ฃผ๋กœ ์ •๋ฆฌํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค!

์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด์ด๋ž€?

๋จผ์ €, ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด์ด๋ž€ ๋ฌด์—‡์ผ๊นŒ์š”?

 

์œ„ํ‚คํ”ผ๋””์•„์— ๋”ฐ๋ฅด๋ฉด,

์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด์ด๋ž€, ์ฃผ์–ด์ง„ ์ƒํ™ฉ์—์„œ์˜ ์†Œํ”„ํŠธ์›จ์–ด ์•„ํ‚คํ…์ณ์˜ ๊ณตํ†ต์ ์ธ ๋ฐœ์ƒ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ผ๋ฐ˜์ ์ธ, ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ•ด๊ฒฐ์ฑ…์„ ์˜๋ฏธํ•œ๋‹ค. ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด์€ ์†Œํ”„ํŠธ์›จ์–ด ๋””์ž์ธ ํŒจํ„ด๊ณผ ์œ ์‚ฌํ•˜์ง€๋งŒ ๋” ํฐ ๋ฒ”์ฃผ์— ์†ํ•œ๋‹ค.

 

๊ฐ„๋‹จํžˆ ๋งํ•˜๋ฉด, ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด์€ ์†Œํ”„ํŠธ์›จ์–ด์˜ ์ „์ฒด์ ์ธ ๊ทธ๋ฆผ, ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“œ๋Š” ํ•ด๊ฒฐ์ฑ…์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

MVC (Model-View-Controller)

๋จผ์ €, ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๋””์ž์ธ ํŒจํ„ด์ธ MVC๋ถ€ํ„ฐ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค!

MVC ํŒจํ„ด์€ Model, View, Controller ์ด๋ ‡๊ฒŒ ์„ธ ๊ฐ€์ง€ ์š”์†Œ๋กœ ๊ตฌ์„ฑ๋œ ํŒจํ„ด์ž…๋‹ˆ๋‹ค.

 

  • Model: ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๋‹ด๋‹น
  • View: ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ง€๋Š” UI
  • Controller: ์‚ฌ์šฉ์ž์˜ Input์„ ๋ฐ›๊ณ  ์ฒ˜๋ฆฌ

Controller๋กœ ์‚ฌ์šฉ์ž์˜ Input(์ž…๋ ฅ)์ด ๋“ค์–ด์˜ค๊ฒŒ ๋˜๋ฉด, ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” Model์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ฑฐ๋‚˜ ๋ถˆ๋Ÿฌ์˜ค๊ณ ,

ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์—ฌ์ค„ View๋ฅผ ์„ ํƒํ•ด์„œ ํ™”๋ฉด์— ๋ณด์—ฌ์ง€๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

 

iOS์—์„œ์˜ MVC ํŒจํ„ด์€ ๊ธฐ์กด์˜ MVC ํŒจํ„ด๊ณผ๋Š” ์•ฝ๊ฐ„ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

iOS์—์„œ๋Š” View์™€ Controller๊ฐ€ ๊ฐ•ํ•˜๊ฒŒ ์—ฐ๊ฒฐ๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— ViewController๊ฐ€ ๊ฑฐ์˜ ๋ชจ๋“  ์ผ์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

์œ„์˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด Controller์˜ ์—ญํ• ์€ UIViewContoller๊ฐ€ ๋‹ด๋‹นํ•˜์—ฌ Controller๊ฐ€ ์‚ฌ์šฉ์ž ์ž…๋ ฅ๋„ ๋ฐ›๊ณ , ๊ทธ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋„ ํ•ด์„œ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ํ™”๋ฉด์— ๋ฟŒ๋ฆฌ๋Š” ๊ฒƒ๊นŒ์ง€ ๋ชจ๋‘ ๋งก๊ธฐ ๋•Œ๋ฌธ์— Controller๊ฐ€ ๊ฑฐ์˜ ๋ชจ๋“  ์ผ์„ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

View์™€ Controller์˜ ๊ฐ•ํ•œ ์—ฐ๊ฒฐ์„ฑ ๋•Œ๋ฌธ์— ๊ฒฐ๊ตญ Massive View Controller๊ฐ€ ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด์ฃ ..

๊ทธ๋ž˜์„œ ๋“ฑ์žฅํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ MVP ์ž…๋‹ˆ๋‹ค.

MVP (Model-View-Presenter)

 

MVP ํŒจํ„ด์€ Model, View, Presenter ์„ธ ๊ฐ€์ง€ ์š”์†Œ๋กœ ๊ตฌ์„ฑ๋œ ํŒจํ„ด์ž…๋‹ˆ๋‹ค.

์•ž์„œ ์„ค๋ช…ํ–ˆ๋˜ MVCํŒจํ„ด์—์„œ์˜ ๋‹จ์ ์ด์—ˆ๋˜ Massiveํ•œ Controller์˜ ์—ญํ• ์„ ๋ถ„๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๊ณ ์•ˆ๋œ ํŒจํ„ด์ž…๋‹ˆ๋‹ค.

 

  • Model: ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๋‹ด๋‹น
  • View: ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ง€๋Š” UI
  • Presenter: ๋กœ์ง์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ๋‹ด๋‹น. View์—์„œ ์š”์ฒญํ•œ ์ •๋ณด๋ฅผ Model๋กœ๋ถ€ํ„ฐ ๊ฐ€๊ณตํ•˜์—ฌ View๋กœ ์ „๋‹ฌ

UIViewController๊ฐ€ MVC์—์„œ๋Š” ๊ฑฐ์˜ ๋ชจ๋“  ์—ญํ• ์„ ๋‹ด๋‹นํ–ˆ์ง€๋งŒ, MVPํŒจํ„ด์—์„œ๋Š” ํ™”๋ฉด์— ๋ณด์—ฌ์ง€๋Š” UI๋งŒ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

๋Œ€์‹  Presenter๊ฐ€ ํ™”๋ฉด์— ์–ด๋–ค ๊ฒƒ์„ ๋ณด์—ฌ์ค„์ง€๋ฅผ ์ฒ˜๋ฆฌํ•ด์ค๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž์˜ Input์„ ๋ฐ›๋Š” ๊ฒƒ์€ View์ด์ง€๋งŒ, ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์ด View์— ๋“ค์–ด์˜ค๊ฒŒ ๋˜๋ฉด View๋Š” ์ด๋ฅผ Presenter์— ์•Œ๋ฆฝ๋‹ˆ๋‹ค.

Presenter๋Š” Model์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ด์šฉํ•ด ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•ด์„œ View์—์„œ ์š”์ฒญํ•œ ๊ฒƒ์„ View๋กœ ๋‹ค์‹œ ์ „๋‹ฌํ•ด์ฃผ์–ด View๋ฅผ ๊ฐฑ์‹ ํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•ด, View๋Š” ํ™”๋ฉด์— ์ถœ๋ ฅํ•˜๋Š” ์—ญํ• ๋งŒ ํ•˜๊ณ  ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋Š” Presenter์™€ Model์ด ๋‹ด๋‹นํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์—ญํ• ์ด ๋ถ„๋ฆฌ ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. 

ํ•˜์ง€๋งŒ, ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด View์™€ Presenter๊ฐ€ 1:1์˜ ๊ด€๊ณ„๋ฅผ ๋งบ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ณตํ†ต๋œ ๋กœ์ง์œผ๋กœ ๊ตฌ์„ฑ๋œ ๋ทฐ๋ผ๋„ ํ™”๋ฉดํ•˜๋‚˜๋‹น Presenter๊ฐ€ ํ•˜๋‚˜ ๋” ํ•„์š”ํ•˜๊ฒŒ ๋˜์–ด ์ฝ”๋“œ๊ฐ€ ๋” ๋Š˜์–ด๋‚˜๊ฑฐ๋‚˜ ๋น„ํšจ์œจ์ ์ธ ๊ตฌ์„ฑ์ด ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

MVVM (Model-View-ViewModel)

MVVM ํŒจํ„ด์€ Model, View, ViewModel ์„ธ ๊ฐ€์ง€ ์š”์†Œ๋กœ ๊ตฌ์„ฑ๋œ ํŒจํ„ด์ž…๋‹ˆ๋‹ค.

์•ž์˜ ๋‘ ํŒจํ„ด์˜ ๋‹จ์ ์„ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ๊ณ ์•ˆ๋œ ํŒจํ„ด์œผ๋กœ, MV์ข…๋ฅ˜ ์ค‘ ๊ฐ€์žฅ ์ตœ๊ทผ์— ๋“ฑ์žฅํ•œ ํŒจํ„ด์ž…๋‹ˆ๋‹ค.

View์™€ Model์˜ ์—ญํ• ์€ MVP์™€ ๋น„์Šทํ•˜๊ณ  Presenter ๋Œ€์‹  ViewModel์ด View์™€ Model ์‚ฌ์ด์˜ ์ค‘์žฌ์ž ์—ญํ• ์„ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ํฐ ํŠน์ง•์ž…๋‹ˆ๋‹ค.

 

  • Model: ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๋‹ด๋‹น
  • View: ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ง€๋Š” UI
  • ViewModel: View๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ View๋ฅผ ์œ„ํ•œ Model. View์™€๋Š” binding์„ ํ•˜์—ฌ ์—ฐ๊ฒฐ ํ›„ View์˜ ์•ก์…˜์„ ๋ฐ›๊ณ  ์—…๋ฐ์ดํŠธ

View๋กœ ์‚ฌ์šฉ์ž์˜ Input์ด ๋“ค์–ด์˜ค๋ฉด ViewModel์— ์•Œ๋ฆฝ๋‹ˆ๋‹ค. 

ViewModel์€ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ Model์— ์š”์ฒญํ•˜๊ณ , Model๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๊ณตํ•ด์„œ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

์ดํ›„, ViewModel์ด View์—๊ฒŒ ์ด๋ฅผ ๋‹ค์‹œ ์ „๋‹ฌํ•ด์ฃผ์ง„ ์•Š์ง€๋งŒ, data binding์œผ๋กœ ์ธํ•ด ์ž๋™์œผ๋กœ View๊ฐ€ ๊ฐฑ์‹ ๋ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ data binding์ด๋ž€โ€ผ๏ธ
MVVM ํŒจํ„ด์—์„œ ํ•„์ˆ˜์ ์œผ๋กœ ์š”๊ตฌ๋˜๋Š” ๊ฒƒ์œผ๋กœ, ์‰ฝ๊ฒŒ ๋งํ•ด Model๊ณผ UI์š”์†Œ ๊ฐ„์˜ ์‹ฑํฌ๋ฅผ ๋งž์ถฐ์ฃผ๋Š” ๊ฒƒ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ํŒจํ„ด์„ ํ†ตํ•ด View์™€ ๋กœ์ง์ด ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์–ด๋„ ํ•œ ์ชฝ์ด ๋ฐ”๋€Œ๋ฉด ๋‹ค๋ฅธ ์ชฝ๋„ ์—…๋ฐ์ดํŠธ๊ฐ€ ์ด๋ฃจ์–ด์ ธ ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.View ๋ถ€๋ถ„์„ SwiftUI๋กœ ํ•˜์—ฌ ๊ด€๋ จ๋œ ๋ฐ”์ธ๋“œ๋ฅผ Combine์˜ ๋„์›€์„ ๋ฐ›์•„ ํ•  ์ˆ˜ ์žˆ๊ณ , RxSwift๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํšจ์œจ์ ์œผ๋กœ data binding์„ ๊ตฌํ˜„ํ•˜์—ฌ MVVM ํŒจํ„ด์— ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์œ„์˜ ๊ทธ๋ฆผ์—์„œ View์™€ ViewModel ์‚ฌ์ด์˜ ํ™”์‚ดํ‘œ๊ฐ€ ์–‘๋ฐฉํ–ฅ์ด ์•„๋‹Œ ๊ฒƒ์ฒ˜๋Ÿผ View๊ฐ€ ViewModel์„ ๊ตฌ๋…ํ•˜๊ธฐ๋งŒ ํ•˜๊ณ ,

ViewModel์€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ฐ์ดํ„ฐ ์š”์†Œ๋ฅผ View์˜ ์š”์ฒญ์— ๋”ฐ๋ผ ๋ฐ”๊พธ๊ธฐ๋งŒ ํ•˜๋ฉด View๊ฐ€ ์ด์— ๋งž๊ฒŒ ๋ฐ”๋€Œ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ฆ‰, UI์™€ ๊ด€๋ จ๋œ ๊ฐ’์„ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์€ ๋ชจ๋‘ View์—์„œ ์ด๋ฃจ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ViewModel์—์„œ View์˜ ๊ฐ’์— ๋Œ€ํ•œ ์ˆ˜์ •์€ ์ „ํ˜€ ์ด๋ฃจ์–ด์ง€์ง€ ์•Š์œผ๋ฉฐ ๋ฐ์ดํ„ฐ ์š”์†Œ๋ฅผ ๊ฐ€์ง€๊ณ ๋งŒ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. View๋Š” ViewModel์„ ๋ฐ”๋ผ๋ณด๊ณ  ์žˆ์œผ๋ฉฐ ViewModel์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ”๋€Œ๋ฉด ์ด์— ๋”ฐ๋ผ UI๋ฅผ ๊ฐฑ์‹ ํ•ฉ๋‹ˆ๋‹ค.

 

์—ฌ๊ธฐ๊นŒ์ง€ MVC, MVP, MVVM 3๊ฐ€์ง€ ์•„ํ‚คํ…์ณ ํŒจํ„ด ์‚ฌ์ด์˜ ์ฐจ์ด์ ์— ์ดˆ์ ์„ ๋งž์ถ”์–ด ์ •๋ฆฌํ•ด๋ณด์•˜๋Š”๋ฐ์š”!

๋Œ€ํ‘œ์ ์ธ ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด์— ๋Œ€ํ•ด ์ดํ•ดํ•˜๋Š” ๋ฐ ์กฐ๊ธˆ์ด๋‚˜๋งˆ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋„ค์š” :)

๊ธด ๊ธ€ ์ฝ์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค๐Ÿ˜Š๐Ÿ˜Š

 


[์ฐธ๊ณ ์ž๋ฃŒ]

https://www.youtube.com/watch?v=bjVAVm3t5cQ 

https://medium.com/ios-os-x-development/ios-architecture-patterns-ecba4c38de52

https://velog.io/@sangjin98/iOS-๋””์ž์ธ-ํŒจํ„ดMVC-MVP-MVVM-VIPER

'๐ŸŽ iOS > Architecture' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[iOS/Architecture] UseCase ํ™œ์šฉ๊ธฐ  (0) 2024.08.28
[Architecture] Clean Architecture  (1) 2024.01.03
[Architecture] VIPER ํŒจํ„ด  (1) 2022.04.15