Tech.blog
MVC(Model-View-Controller) pattern
2021.09.08
thumbnail
#defer
#async

๐Ÿ“’ MVC

MVC๋Š” Model View Controller์˜ ์•ฝ์ž๋กœ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค, ๋ฐ์ดํ„ฐ ๋ฐ ๋…ผ๋ฆฌ ์ œ์–ด๋ฅผ ๊ตฌํ˜„ํ•˜๋Š”๋ฐ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด ๋””์ž์ธ ํŒจํ„ด์ด๋‹ค.

์†Œํ”„ํŠธ์›จ์–ด์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ํ™”๋ฉด์„ ๊ตฌ๋ถ„ํ•˜๋Š”๋ฐ ์ค‘์ ์„ ๋‘๊ณ  ์žˆ๋‹ค.

๐Ÿ” Model

์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด '๋ฌด์—‡'์„ ํ•  ๊ฒƒ์ธ์ง€ ์ •์˜ํ•˜๊ณ  ๋ฐ์ดํ„ฐ์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๊ด€๋ฆฌํ•œ๋‹ค.

  • ์ฒ˜๋ฆฌ๋˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜, DB์™€ ์ƒํ˜ธ์ž‘์šฉ(CRUD Create Read Update Delete), ๋ฐ์ดํ„ฐ ๋“ฑ

๐Ÿ” View

ํ™”๋ฉด์— '๋ฌด์—‡'์ธ๊ฐ€๋ฅผ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•œ ์—ญํ• ์„ ํ•œ๋‹ค.

์ปจํŠธ๋กค๋Ÿฌ ํ•˜์œ„์— ์ข…์†๋˜์–ด, ๋ชจ๋ธ์ด๋‚˜ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋ณด์—ฌ์ฃผ๋ ค๊ณ  ํ•˜๋Š” ๋ชจ๋“  ํ•„์š”ํ•œ ๊ฒƒ๋“ค์„ ๋ณด์—ฌ์ค€๋‹ค.

  • ์ตœ์ข… ์‚ฌ์šฉ์ž์—๊ฒŒ '๋ฌด์—‡'์„ ํ™”๋ฉด(UI)์œผ๋กœ ๋ณด์—ฌ์คŒ

๐Ÿ” Controller

๋ชจ๋ธ์ด '์–ด๋–ป๊ฒŒ' ์ฒ˜๋ฆฌํ•  ์ง€๋ฅผ ์•Œ๋ ค์ฃผ๋Š” ์—ญํ• ์„ ํ•˜๊ณ , ๋ชจ๋ฐ”์ผ์—์„œ๋Š” ํ™”๋ฉด์˜ ๋กœ์ง์ฒ˜๋ฆฌ ๋ถ€๋ถ„์ด๋‹ค.

ํ™”๋ฉด์—์„œ ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์„ ๋ฐ›์•„์„œ ์ฒ˜๋ฆฌ๋˜๋Š” ๋ถ€๋ถ„์„ ๊ตฌํ˜„ํ•˜๊ฒŒ ๋˜๋ฉฐ, ์š”์ฒญ ๋‚ด์šฉ์„ ๋ถ„์„ํ•ด์„œ Model๊ณผ View์— ์—…๋ฐ์ดํŠธ ์š”์ฒญ์„ ํ•˜๊ฒŒ ๋œ๋‹ค.

Controller๋Š” Model๊ณผ View๊ฐ€ ๊ฐ๊ฐ ๋ฌด์—‡์„ ํ•ด์•ผ ํ•  ์ง€๋ฅผ ์•Œ๊ณ  ์žˆ๊ณ , ํ†ต์ œํ•œ๋‹ค.

๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋Š” Model๊ณผ ์™„์ „ํžˆ UI์— ์˜์กด์ ์ธ View๊ฐ€ ์„œ๋กœ ์ง์ ‘ ์ด์•ผ๊ธฐํ•  ์ˆ˜ ์—†๊ฒŒ ํ•œ๋‹ค.


MVC ์˜ˆ์‹œ

๊ฐ„๋‹จํ•œ ์‡ผํ•‘ ๋ฆฌ์ŠคํŠธ ์•ฑ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž. ์ด๋ฒˆ ์ฃผ์— ์‚ฌ์•ผํ•  ๊ฐ ํ•ญ๋ชฉ์˜ ์ด๋ฆ„, ๊ฐฏ์ˆ˜, ๊ฐ€๊ฒฉ์˜ ๋ชฉ๋ก์ด ํ•„์š”ํ•˜๋‹ค.

์ถœ์ฒ˜ : MDN

Model์€ ๋ฐ์ดํ„ฐ์˜ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ๋ชจ๋ธ์„ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ทฐ์—๊ฒŒ ์•Œ๋ฆฌ๋ฉฐ(๋”ฐ๋ผ์„œ ํ•„์š”ํ•œ๋Œ€๋กœ ํ™”๋ฉด์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค) ์—…๋ฐ์ดํŠธ ๋œ ๋ทฐ๋ฅผ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ๋กœ์ง์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๊ฐ€๋” ์ปจํŠธ๋กค๋Ÿฌ์—๊ฒŒ ์•Œ๋ฆฌ๊ธฐ๋„ ํ•œ๋‹ค.

๋ชจ๋ธ์€ ๋ฆฌ์ŠคํŠธ ํ•ญ๋ชฉ์ด ํฌํ•จํ•ด์•ผ ํ•˜๋Š” ๋ฐ์ดํ„ฐ < ํ’ˆ๋ชฉ, ๊ฐ€๊ฒฉ, ๋“ฑ > ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๋ฆฌ์ŠคํŠธ ํ•ญ๋ชฉ์ด ๋ฌด์—‡์ธ์ง€๋ฅผ ์ง€์ •ํ•œ๋‹ค.

View๋Š” ์•ฑ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๋ฐฉ์‹์ด๋ฉฐ ํ•ญ๋ชฉ์ด ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ง€๋Š” ๋ฐฉ์‹์„ ์ •์˜ํ•˜๋ฉฐ, ํ‘œ์‹œํ•  ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋ธ๋กœ๋ถ€ํ„ฐ ๋ฐ›๋Š”๋‹ค.

Controller๋Š” ์•ฑ์˜ ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ์˜ ์ž…๋ ฅ์— ๋Œ€ํ•œ ์‘๋‹ต์œผ๋กœ ๋ชจ๋ธ ๋˜๋Š” ๋ทฐ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜๋Š” ๋กœ์ง์„ ํฌํ•จํ•œ๋‹ค.

ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์ž…๋ ฅ ํผ๊ณผ ๋ฒ„ํŠผ์„ ๊ฐ–๋Š”๋‹ค. ์ด๋Ÿฐ ์•ก์…˜๋“ค์€ ๋ชจ๋ธ์ด ์—…๋ฐ์ดํŠธ ๋˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ์ž…๋ ฅ์ด ์ปจํŠธ๋กค๋Ÿฌ์—๊ฒŒ ์ „์†ก๋˜๊ณ , ๋ชจ๋ธ์„ ์ ๋‹นํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•œ ๋‹ค์Œ ์—…๋ฐ์ดํŠธ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ทฐ๋กœ ์ „์†กํ•œ๋‹ค.

ํ•ญ๋ชฉ์„ ์•ŒํŒŒ๋ฒณ ์ˆœ์„œ๋กœ ์ •๋ ฌํ•œ๋‹ค๋˜์ง€ ๊ฐ€๊ฒฉ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋ชจ๋ธ์„ ์—…๋ฐ์ดํŠธ ํ•  ํ•„์š” ์—†์ด ๋ฐ”๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.


๐Ÿ” Web๊ณผ MVC

์ถœ์ฒ˜ : ์ƒํ™œ์ฝ”๋”ฉ

์œ„ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ์‚ฌ์šฉ์ž๊ฐ€ Controller๋ฅผ ์กฐ์ž‘ํ•˜๋ฉด Controller๋Š” Model์„ ํ†ตํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ๊ทธ ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์‹œ๊ฐ์ ์ธ ํ‘œํ˜„์„ ๋‹ด๋‹นํ•˜๋Š” View๋ฅผ ์ œ์–ดํ•ด์„œ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ „๋‹ฌํ•˜๊ฒŒ ๋œ๋‹ค.

  • ์‚ฌ์šฉ์ž๊ฐ€ ์›น ์‚ฌ์ดํŠธ์— ์ ‘์†ํ•œ๋‹ค. (USES)
  • Controller๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญํ•œ ์›นํŽ˜์ด์ง€๋ฅผ ์„œ๋น„์Šคํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ชจ๋ธ์„ ํ˜ธ์ถœํ•œ๋‹ค. (MANIPULATES)
  • ๋ชจ๋ธ์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‚˜ ํŒŒ์ผ๊ณผ ๊ฐ™์€ ๋ฐ์ดํ„ฐ ์†Œ์Šค๋ฅผ ์ œ์–ดํ•œ ํ›„์— ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.
  • Controller๋Š” Model์ด ๋ฆฌํ„ดํ•œ ๊ฒฐ๊ณผ๋ฅผ View์— ๋ฐ˜์˜ํ•œ๋‹ค. (UPDATES)
  • ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ˜์˜๋œ View๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ง„๋‹ค. (SEES)

๐Ÿ” MVC ํŒจํ„ด์˜ ํ•„์š”์„ฑ ๋ฐ ํ•œ๊ณ„์ 

๋””์ž์ธ ํŒจํ„ด์„ ์•Œ๊ธฐ ์ „์—๋Š” ์˜จ๊ฐ– ๋ชจ๋“ˆ๋“ค์ด ๋’ค์ฃฝ๋ฐ•์ฃฝ ์„ž์—ฌ ์ง€์ €๋ถ„ํ•œ ์ฝ”๋“œ๋กœ ๊ฐ€๋“ํ–ˆ๋‹ค. ์ด๋Ÿฐ ์ฝ”๋“œ๋Š” ๊ฐœ๋ฐœ์ž ๋ณธ์ธ์ด ์œ ์ง€๋ณด์ˆ˜ ํ•˜๊ธฐ์—๋„ ๋ณต์žกํ•˜๊ณ , ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๊ฐ€ ํˆฌ์ž…๋˜๋ฉด ๋ถ„์„ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต๊ณ  ์œ ์ง€๋ณด์ˆ˜ ํ•˜๊ธฐ๋„ ํž˜๋“ค๋‹ค.

MVC ํŒจํ„ด์€ ์—ญํ• ์— ๋”ฐ๋ผ ํ™•์‹คํ•˜๊ฒŒ ๋ถ„๋ฆฌํ•˜์—ฌ ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์šฉ์ดํ•˜๊ฒŒ ํ•˜๊ณ  ํ”„๋กœ๊ทธ๋žจ์˜ ํ™•์žฅ์„ฑ๊ณผ ์œ ์—ฐ์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•œ ๊ธฐ๋ฒ•์ด๋‹ค.

๋ฐ์ดํ„ฐ๊ฐ€ ์ถ”๊ฐ€๋˜๋ฉด Model ๋ถ€๋ถ„๋งŒ ์ˆ˜์ •ํ•˜๊ณ , UI๊ฐ€ ์ˆ˜์ •๋˜๋ฉด View ๋ถ€๋ถ„๋งŒ ์ˆ˜์ •ํ•œ๋‹ค.

๋ฌผ๋ก  Controller๋„ ๋‘ ๋ถ€๋ถ„์„ ๊ด€์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ถ€ ์ˆ˜์ •์ด ํ•„์š”ํ•˜์ง€๋งŒ ๊ธฐ์กด์ฒ˜๋Ÿผ ๋ฉ”์ธ ๋‹ค์ด์–ผ๋กœ๊ทธ/ํผ์—์„œ์˜ ๋ฌด๋ถ„๋ณ„ํ•œ ํ•˜๋“œ ์ฝ”๋”ฉ์€ ํ•„์š”๊ฐ€ ์—†๋‹ค.

์„œ๋กœ ๋ถ„๋ฆฌ๋˜์–ด ๊ฐ์ž์˜ ์—ญํ• ์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ๋”ํ•˜์—ฌ ๊ฐœ๋ฐœ์„ ํ•˜๊ณ  ๊ทธ๋ ‡๊ฒŒ ๋งŒ๋“ค๋ฉด ์œ ์ง€๋ณด์ˆ˜, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ™•์žฅ์„ฑ, ์œ ์—ฐ์„ฑ์ด ์ฆ๊ฐ€ํ•˜๊ณ  ์ค‘๋ณต์ฝ”๋”ฉ์ด๋ผ๋Š” ๋ฌธ์ œ์  ๋˜ํ•œ ์‚ฌ๋ผ์ง„๋‹ค.

ํ•œ๊ณ„์ 

ํ•œ Model์€ ๋‹ค์ˆ˜์˜ View๋“ค์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ณ  ๋ฐ˜๋Œ€๋กœ Controller๋ฅผ ํ†ตํ•ด์„œ ํ•œ View์— ์—ฐ๊ฒฐ๋˜๋Š” Model๋„ ์—ฌ๋Ÿฌ ๊ฐœ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค.

์ด๋ ‡๊ฒŒ ๋˜๋ฉด ๊ฒฐ๊ณผ์ ์œผ๋กœ View์™€ Model์ด ์„œ๋กœ ์˜์กด์„ฑ์„ ๋„๊ฒŒ ๋œ๋‹ค.

๋ฌผ๋ก  ์„ค๊ณ„๋ฅผ ์ž˜ ํ•œ๋‹ค๋ฉด Model๊ฐ„์˜ ์˜์กด์„ฑ ๋ฟ๋งŒ์•„๋‹ˆ๋ผ View์™€ Model ์‚ฌ์ด์— ์ƒ๊ธฐ๋Š” ์˜์กด์„ฑ๋„ ์ค„์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ํ”„๋กœ๊ทธ๋žจ ํŠน์„ฑ์ƒ ํ•„์—ฐ์ ์œผ๋กœ ํ™”๋ฉด์— ๋ณต์žกํ•œ ํ™”๋ฉด๊ณผ ๋ฐ์ดํ„ฐ์˜ ๊ตฌ์„ฑ ํ•„์š”ํ•œ ๊ตฌ์„ฑ์ด๋ผ๋ฉด, Controller์— ๋‹ค์ˆ˜์˜ Model๊ณผ View๊ฐ€ ๋ณต์žกํ•˜๊ฒŒ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ์ƒํ™ฉ์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค.

์ด๋ ‡๊ฒŒ MVC ๊ทœ๋ชจ ์ž์ฒด๊ฐ€ ๋„ˆ๋ฌด ๋ณต์žกํ•˜๊ณ  ๋น„๋Œ€ํ•ด์ ธ์„œ, ์ƒˆ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ• ๋•Œ๋งˆ๋‹ค ์˜์กด์„ฑ์„ ์ผ์ผ์ด ํ•ด๊ฒฐํ•ด์•ผํ•ด์„œ ๋ฉ”์†Œ๋“œ ๋ถ„์„์ด๋‚˜ ํ…Œ์ŠคํŠธ๋„ ์–ด๋ ต๊ฒŒ ๋œ๋‹ค. ์ด๋Ÿฐ ํ˜•ํƒœ์˜ MVC๋ฅผ Massive ViewController๋ผ๊ณ  ๋ถ€๋ฅด๋Š”๋ฐ, ์ด๋Š” MVC์˜ ํ•œ๊ณ„๋ฅผ ํ‘œํ˜„ํ•œ ์šฉ์–ด์ด๊ธฐ๋„ ํ•œ๋‹ค.

์ถœ์ฒ˜


ยฉ 2022. Tech Blog