๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ

์Šคํ”„๋ง MVC ํŒจํ„ด ๊ฐœ๋… ์•Œ์•„๋ณด๊ธฐ

by 5566 2023. 8. 28.

1. MVC ํŒจํ„ด์ด๋ž€

MVC (Model-View-Controller) ํŒจํ„ด์€ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์ด๋‚˜ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ค๊ณ„์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋””์ž์ธ ํŒจํ„ด์ž…๋‹ˆ๋‹ค. ์ด ํŒจํ„ด์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ชจ๋ธ, ๋ทฐ, ๊ทธ๋ฆฌ๊ณ  ์ปจํŠธ๋กค๋Ÿฌ๋ผ๊ณ  ํ•˜๋Š” ์„ธ ๊ฐ€์ง€ ์š”์†Œ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

  • ๋ชจ๋ธ(Model): ๋ชจ๋ธ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฐ์ดํ„ฐ ๋ฐ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ์˜ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๊ณ , ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜ ์กฐ์ž‘ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋ธ์€ ๋…๋ฆฝ์ ์œผ๋กœ ์กด์žฌํ•˜๋ฉฐ, ๋ฐ์ดํ„ฐ์˜ ๋ณ€๊ฒฝ ๋ฐ ์—…๋ฐ์ดํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • ๋ทฐ(View): ๋ทฐ๋Š” ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค(UI)๋ฅผ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋ธ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ํ‘œํ˜„ํ•˜๊ณ , ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์„ ๋ฐ›์•„ ์ปจํŠธ๋กค๋Ÿฌ์— ์ „๋‹ฌํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋ทฐ๋Š” ๋ณด์—ฌ์งˆ ๋ฐ์ดํ„ฐ์˜ ํ‘œํ˜„ ๋ฐฉ์‹์„ ์ •์˜ํ•˜๋ฉฐ, ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ทฐ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ปจํŠธ๋กค๋Ÿฌ(Controller): ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋ชจ๋ธ๊ณผ ๋ทฐ ์‚ฌ์ด์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ๊ด€๋ฆฌํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์„ ๋ฐ›์•„ ๋ชจ๋ธ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ฑฐ๋‚˜, ๋ชจ๋ธ๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์„œ ๋ทฐ์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์ค„ ๋ทฐ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

MVC ํŒจํ„ด์€ ๊ฐ ์š”์†Œ๊ฐ€ ๋…๋ฆฝ์ ์œผ๋กœ ๊ฐœ๋ฐœ๋˜์–ด ์œ ์ง€๋ณด์ˆ˜์™€ ํ…Œ์ŠคํŠธ๊ฐ€ ์šฉ์ดํ•˜๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฐ ๋ถ€๋ถ„์„ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ฐœ๋ฐœํ•˜๋ฏ€๋กœ ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ํ™•์žฅ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์ œ๊ณตํ•˜๋Š” ์Šคํ”„๋ง MVC๋Š” MVC ํŒจํ„ด์„ ๊ธฐ๋ฐ˜์œผ๋กœํ•œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

2. ์Šคํ”„๋ง MVC ํŒจํ„ด์˜ ๊ตฌ์„ฑ ์š”์†Œ

์Šคํ”„๋ง MVC๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์–‘ํ•œ ๊ตฌ์„ฑ ์š”์†Œ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. DispatcherServlet: ์Šคํ”„๋ง MVC์˜ ํ•ต์‹ฌ์ด๋ฉฐ, ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์˜ ์ง„์ž…์ ์ž…๋‹ˆ๋‹ค. DispatcherServlet์€ ์š”์ฒญ์„ ๋ฐ›์•„๋“ค์ด๊ณ , ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์ ์ ˆํ•œ ์ปจํŠธ๋กค๋Ÿฌ์—๊ฒŒ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ์‘๋‹ต์„ ์ƒ์„ฑํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  2. HandlerMapping: ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์— ๋Œ€ํ•ด ์–ด๋–ค ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์ฒ˜๋ฆฌํ• ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. HandlerMapping์€ ์š”์ฒญ URL์„ ๋ถ„์„ํ•˜์—ฌ ์ ์ ˆํ•œ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ฐพ์•„์ฃผ๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  3. Controller: ์ปจํŠธ๋กค๋Ÿฌ๋Š” ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์‹ค์ œ๋กœ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๊ฑฐ๋‚˜ ํ•„์š”ํ•œ ์„œ๋น„์Šค๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

  4. ModelAndView: ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์ฒ˜๋ฆฌํ•œ ๊ฒฐ๊ณผ ๋ฐ์ดํ„ฐ ๋ฐ ๋ทฐ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. ModelAndView๋Š” ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์ƒ์„ฑ๋˜๊ณ , DispatcherServlet์— ์˜ํ•ด ๋ทฐ์— ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.

  5. ViewResolver: ViewResolver๋Š” ๋ทฐ์˜ ๋…ผ๋ฆฌ์ ์ธ ์ด๋ฆ„์„ ๋ทฐ์˜ ์‹ค์ œ ๊ฒฝ๋กœ๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ๋ทฐ์˜ ์ด๋ฆ„๊ณผ ๊ฒฝ๋กœ๋ฅผ ๋งคํ•‘ํ•˜์—ฌ ์ ์ ˆํ•œ ๋ทฐ๋ฅผ ์ฐพ์•„์„œ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  6. View: ๋ทฐ๋Š” ์ปจํŠธ๋กค๋Ÿฌ์˜ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ํ‘œํ˜„ํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ๋ทฐ๋Š” JSP, Thymeleaf, Freemarker ๋“ฑ์˜ ํ…œํ”Œ๋ฆฟ ์—”์ง„์„ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

  7. Model: Model์€ ๋ทฐ์— ์ „๋‹ฌ๋  ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ Model ๊ฐ์ฒด์— ์„ค์ •ํ•˜๊ณ , ์ด๋ฅผ ๋ทฐ๋กœ ์ „๋‹ฌํ•จ์œผ๋กœ์จ ๊ฒฐ๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ๋ทฐ์— ๋ฐ˜์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์Šคํ”„๋ง MVC์˜ ๊ตฌ์„ฑ ์š”์†Œ๋“ค์€ ๊ฐ๊ฐ์˜ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, ์„œ๋กœ ํ˜‘๋ ฅํ•˜์—ฌ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฐœ๋ฐœ ๋ฐ ์ฒ˜๋ฆฌ ํ๋ฆ„์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ฐ๊ฐ์˜ ๊ตฌ์„ฑ ์š”์†Œ๋“ค์€ ์Šคํ”„๋ง์˜ ์˜์กด์„ฑ ์ฃผ์ž…(Dependency Injection)๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ์œ ์—ฐํ•˜๊ฒŒ ์กฐํ•ฉ์ด ๊ฐ€๋Šฅํ•˜๊ณ , ํ•„์š”์— ๋”ฐ๋ผ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

3. ์Šคํ”„๋ง MVC ์ž‘๋™ ์›๋ฆฌ

์Šคํ”„๋ง MVC๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์ผ๋ จ์˜ ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์ณ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์Šคํ”„๋ง MVC์˜ ์ž‘๋™ ์›๋ฆฌ์— ๋Œ€ํ•œ ์ƒ์„ธํ•œ ์„ค๋ช…์ž…๋‹ˆ๋‹ค.

  1. ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์ด DispatcherServlet์— ๋„์ฐฉํ•ฉ๋‹ˆ๋‹ค.
  2. DispatcherServlet์€ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด HandlerMapping์—๊ฒŒ ์š”์ฒญ URL์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  3. HandlerMapping์€ ์š”์ฒญ URL์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ ์ ˆํ•œ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ฐพ์•„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  4. DispatcherServlet์€ ๋ฐ˜ํ™˜๋œ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  5. ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์‹ค์ œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๊ณ , ํ•„์š”ํ•œ ์„œ๋น„์Šค๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  6. ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์ฒ˜๋ฆฌํ•œ ๊ฒฐ๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ModelAndView ๊ฐ์ฒด์— ์„ค์ •ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  7. DispatcherServlet์€ ViewResolver์—๊ฒŒ ๋ทฐ์˜ ๋…ผ๋ฆฌ์ ์ธ ์ด๋ฆ„์„ ์ „๋‹ฌํ•˜์—ฌ ์‹ค์ œ ๋ทฐ์˜ ๊ฒฝ๋กœ๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค.
  8. ViewResolver๋Š” ๋ทฐ์˜ ์ด๋ฆ„์„ ์‹ค์ œ ๋ทฐ์˜ ๊ฒฝ๋กœ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  9. DispatcherServlet์€ View ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ModelAndView ๊ฐ์ฒด์™€ ํ•จ๊ป˜ View์—๊ฒŒ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  10. View๋Š” ์ „๋‹ฌ๋ฐ›์€ ModelAndView ๊ฐ์ฒด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์Šคํ”„๋ง MVC์˜ ์ž‘๋™ ์›๋ฆฌ์—์„œ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•˜๋Š” ๊ฒƒ์€ DispatcherServlet, HandlerMapping, ์ปจํŠธ๋กค๋Ÿฌ, ViewResolver, View ๋“ฑ์˜ ๊ตฌ์„ฑ ์š”์†Œ์ž…๋‹ˆ๋‹ค. DispatcherServlet์€ ๋ชจ๋“  ์š”์ฒญ์˜ ์ง„์ž…์ ์ด๋ฉฐ, HandlerMapping์€ ์š”์ฒญ URL์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ ์ ˆํ•œ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ฐพ์•„์ฃผ๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์‹ค์ œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๊ณ , ViewResolver๋Š” ๋ทฐ์˜ ์ด๋ฆ„์„ ์‹ค์ œ ๋ทฐ์˜ ๊ฒฝ๋กœ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. View๋Š” ์ „๋‹ฌ๋ฐ›์€ ModelAndView ๊ฐ์ฒด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์Šคํ”„๋ง MVC์˜ ์ž‘๋™ ์›๋ฆฌ์— ๋”ฐ๋ผ ์š”์ฒญ์€ ๊ฐ๊ฐ์˜ ๊ตฌ์„ฑ ์š”์†Œ๋“ค์„ ํ†ตํ•ด ์ฒ˜๋ฆฌ๋˜๋ฉฐ, ๊ฒฐ๊ณผ๋Š” ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ ์ ˆํ•œ ๋ฐฉ์‹์œผ๋กœ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ž‘๋™ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๊ณ  ํ™œ์šฉํ•จ์œผ๋กœ์จ ์Šคํ”„๋ง MVC์—์„œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4. ์Šคํ”„๋ง MVC์˜ ์žฅ์ 

์Šคํ”„๋ง MVC๋Š” ๋งŽ์€ ์žฅ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์— ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์Šคํ”„๋ง MVC์˜ ์ฃผ์š” ์žฅ์ ์— ๋Œ€ํ•œ ์ƒ์„ธํ•œ ์„ค๋ช…์ž…๋‹ˆ๋‹ค.

1. ์œ ์—ฐํ•œ ์•„ํ‚คํ…์ฒ˜

์Šคํ”„๋ง MVC๋Š” MVC ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐœ๋ฐœ๋˜์–ด ์ฝ”๋“œ์˜ ์œ ์ง€ ๋ฐ ํ™•์žฅ์ด ์šฉ์ดํ•ฉ๋‹ˆ๋‹ค. ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ๋ทฐ์˜ ๋ถ„๋ฆฌ๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ๊ณผ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ์Šคํ”„๋ง์˜ ์˜์กด์„ฑ ์ฃผ์ž…(Dependency Injection)์„ ํ†ตํ•ด ๊ฐ๊ฐ์˜ ๊ตฌ์„ฑ ์š”์†Œ๋“ค์„ ์œ ์—ฐํ•˜๊ฒŒ ์กฐํ•ฉํ•  ์ˆ˜ ์žˆ์–ด ๊ฐœ๋ฐœ์ž๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์š”๊ตฌ์‚ฌํ•ญ์— ๋งž๊ฒŒ ์ปค์Šคํ…€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. ๊ฐ•๋ ฅํ•œ ํ…Œ์ŠคํŠธ ์ง€์›

์Šคํ”„๋ง MVC๋Š” ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์™€ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ๋ฅผ ์ง€์›ํ•˜์—ฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ์‰ฝ๊ฒŒ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค๋‹ˆ๋‹ค. ์ปจํŠธ๋กค๋Ÿฌ์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋ถ„๋ฆฌํ•˜๊ณ , ์˜์กด์„ฑ ์ฃผ์ž…์„ ํ†ตํ•ด ํ…Œ์ŠคํŠธ์šฉ ๊ฐ์ฒด๋ฅผ ์‰ฝ๊ฒŒ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ์Šคํ”„๋ง์˜ ํ…Œ์ŠคํŠธ ์ง€์› ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ„ํŽธํ•˜๊ฒŒ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์„ ์„ค์ •ํ•˜๊ณ  ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3. ํ™•์žฅ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ

์Šคํ”„๋ง MVC๋Š” ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜์˜ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์ œ๊ณตํ•˜๋ฏ€๋กœ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•˜๊ธฐ๊ฐ€ ์šฉ์ดํ•ฉ๋‹ˆ๋‹ค. ๊ฐ๊ฐ์˜ ๊ตฌ์„ฑ ์š”์†Œ๋“ค์€ ๋…๋ฆฝ์ ์œผ๋กœ ๊ฐœ๋ฐœ ๋ฐ ํ…Œ์ŠคํŠธ๋  ์ˆ˜ ์žˆ์–ด ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ์Šคํ”„๋ง์˜ AOP(Aspect-Oriented Programming)๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ณตํ†ต ๊ธฐ๋Šฅ์„ ๋ชจ๋“ˆํ™”ํ•˜์—ฌ ์ ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ฝ”๋“œ์˜ ์ค‘๋ณต์„ ์ค„์ด๊ณ  ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๊ฐ•ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4. ๋‹ค์–‘ํ•œ ๋ทฐ ํ…œํ”Œ๋ฆฟ์˜ ์ง€์›

์Šคํ”„๋ง MVC๋Š” ๋‹ค์–‘ํ•œ ๋ทฐ ํ…œํ”Œ๋ฆฟ ์—”์ง„์„ ์ง€์›ํ•˜์—ฌ ๊ฐœ๋ฐœ์ž๋Š” ์„ ํ˜ธํ•˜๋Š” ๋ทฐ ํ…œํ”Œ๋ฆฟ์„ ์„ ํƒํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. JSP, Thymeleaf, Freemarker ๋“ฑ ๋‹ค์–‘ํ•œ ํ…œํ”Œ๋ฆฟ ์—”์ง„์„ ์‚ฌ์šฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ UI ๋ Œ๋”๋ง์„ ์†์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ๋ทฐ์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์˜ ๋ถ„๋ฆฌ๋ฅผ ํ†ตํ•ด ๋””์ž์ด๋„ˆ์™€ ๊ฐœ๋ฐœ์ž์˜ ํ˜‘์—…์ด ์›ํ™œํžˆ ์ด๋ค„์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

5. ์Šคํ”„๋ง MVC์˜ ํ™œ์šฉ ์˜ˆ์‹œ

์Šคํ”„๋ง MVC๋Š” ๋‹ค์–‘ํ•œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ ์‹œ๋‚˜๋ฆฌ์˜ค์— ์œ ์šฉํ•˜๊ฒŒ ํ™œ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์Šคํ”„๋ง MVC์˜ ํ™œ์šฉ ์˜ˆ์‹œ์— ๋Œ€ํ•œ ์ƒ์„ธํ•œ ์„ค๋ช…์ž…๋‹ˆ๋‹ค.

1. ์ „ํ†ต์ ์ธ CRUD ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜

์Šคํ”„๋ง MVC๋Š” ์ „ํ†ต์ ์ธ CRUD(Create, Read, Update, Delete) ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฐœ๋ฐœ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์—ฐ๋™ํ•˜์—ฌ ์‚ฌ์šฉ์ž์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑ, ์กฐํšŒ, ์ˆ˜์ •, ์‚ญ์ œํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ์˜ ์ƒ์„ฑ, ์ˆ˜์ •, ์‚ญ์ œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ , ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์ƒํ˜ธ์ž‘์šฉ์€ ์„œ๋น„์Šค ๋ ˆ์ด์–ด์—์„œ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋ทฐ๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ฒฐ๊ณผ๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

2. RESTful ์›น ์„œ๋น„์Šค

์Šคํ”„๋ง MVC๋Š” REST(Representational State Transfer) ์•„ํ‚คํ…์ฒ˜ ์Šคํƒ€์ผ์„ ๋”ฐ๋ฅด๋Š” ์›น ์„œ๋น„์Šค์˜ ๊ฐœ๋ฐœ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. RESTful ์›น ์„œ๋น„์Šค๋Š” HTTP ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์“ฐ๋Š”๋ฐ ์ง‘์ค‘๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ธํ„ฐํŽ˜์ด์Šค(API)์ž…๋‹ˆ๋‹ค. ์Šคํ”„๋ง MVC๋Š” HTTP ๋ฉ”์†Œ๋“œ(GET, POST, PUT, DELETE)์™€ URL ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ๋ณ„ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ CRUD ์ž‘์—…์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ปจํŠธ๋กค๋Ÿฌ๋Š” RESTful API์˜ ์—”๋“œํฌ์ธํŠธ๋ฅผ ์ œ๊ณตํ•˜๊ณ , ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋กœ์ง์€ ์„œ๋น„์Šค ๋ ˆ์ด์–ด์— ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋Š” JSON, XML ๋“ฑ์˜ ํ˜•์‹์œผ๋กœ ๋ฐ˜ํ™˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3. ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ… ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜

์Šคํ”„๋ง MVC๋Š” WebSocket๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์—ฌ ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ… ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. WebSocket์€ ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ๊ฐ„์˜ ์–‘๋ฐฉํ–ฅ ํ†ต์‹ ์„ ์ง€์›ํ•˜๋Š” ํ”„๋กœํ† ์ฝœ๋กœ, ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํ”„๋ง MVC๋Š” WebSocket์„ ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์„ค์ •๊ณผ API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ปจํŠธ๋กค๋Ÿฌ๋Š” WebSocket ์—ฐ๊ฒฐ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ , ๋ฉ”์‹œ์ง€๋ฅผ ์†ก์ˆ˜์‹ ํ•˜๋ฉฐ, ํด๋ผ์ด์–ธํŠธ์™€์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋กœ์ง์€ ์„œ๋น„์Šค ๋ ˆ์ด์–ด์— ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋Š” ์‹ค์‹œ๊ฐ„์œผ๋กœ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „๋‹ฌ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4. ํฌํ„ธ ์‚ฌ์ดํŠธ

์Šคํ”„๋ง MVC๋Š” ํฌํ„ธ ์‚ฌ์ดํŠธ์˜ ๊ฐœ๋ฐœ์—๋„ ์œ ์šฉํ•˜๊ฒŒ ํ™œ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํฌํ„ธ ์‚ฌ์ดํŠธ๋Š” ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ๊ณผ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ, ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ฐœ์ธํ™”๋œ ์ฝ˜ํ…์ธ ๋ฅผ ์ œ๊ณตํ•˜๊ณ , ์—ฌ๋Ÿฌ ์„œ๋น„์Šค์— ๋Œ€ํ•œ ํ†ตํ•ฉ ์ ‘๊ทผ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์Šคํ”„๋ง MVC๋Š” ์ปจํŠธ๋กค๋Ÿฌ์˜ ๋™์  ๋กœ๋”ฉ, ์ฃผ์š” ์ปดํฌ๋„ŒํŠธ์˜ ์žฌ์‚ฌ์šฉ, ํ…œํ”Œ๋ฆฟ ์—”์ง„์˜ ๋‹ค์–‘ํ•œ ์ง€์› ๋“ฑ์„ ํ†ตํ•ด ํฌํ„ธ ์‚ฌ์ดํŠธ์˜ ๊ตฌํ˜„์— ์œ ์šฉํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์Šคํ”„๋ง MVC๋Š” ๋‹ค์–‘ํ•œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ ์‹œ๋‚˜๋ฆฌ์˜ค์— ์œ ์—ฐํ•˜๊ฒŒ ํ™œ์šฉ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์„ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค๋‹ˆ๋‹ค. ์Šคํ”„๋ง์˜ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ๊ณผ ๊ฒฐํ•ฉํ•˜์—ฌ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋”์šฑ ๊ฐ•๋ ฅํ•˜๊ฒŒ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋Œ“๊ธ€