๐Ÿฅ• MVC(Model-View-Controller)

MVC(Model-View-Controller)์™€ MVC2๋Š” ์†Œํ”„ํŠธ์›จ์–ด ๋””์ž์ธ ํŒจํ„ด ์ค‘ ํ•˜๋‚˜์ด๋‹ค. ์šฐ์„  MVC๊ฐ€ ๋ฌด์—‡์ธ์ง€์— ๋Œ€ํ•ด ๋จผ์ € ์•Œ์•„๋ณด์ž.

  • Model : Model์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ํŒŒ์ผ, ์™ธ๋ถ€ ์„œ๋น„์Šค์™€์˜ ์—ฐ๋™ ๋“ฑ ๋ฐ์ดํ„ฐ ๊ด€๋ จ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. ์ฒ˜๋ฆฌํ•œ ์ž‘์—… ๋ฐ์ดํ„ฐ๋ฅผ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์‘๋‹ต์œผ๋กœ ๋Œ๋ ค์ฃผ๋Š” ์ž‘์—…์˜ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ Model์ด๋ผ๊ณ  ํ•œ๋‹ค.

  • View : ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๋ถ€๋ถ„์ด๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ๋ณด๋Š” ํ™”๋ฉด์„ ๊ตฌ์„ฑํ•˜๋ฉฐ, Model์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์‹œ์ž‘์ ์œผ๋กœ ํ‘œํ˜„ํ•œ๋‹ค. (HTML, PDF, JSON)

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

์ด์ œ ์Šคํ”„๋ง์—์„œ ์‚ฌ์šฉํ•˜๋Š” MVC ๊ตฌ์กฐ๋ฅผ ์‚ดํŽด๋ณด์ž.

Spring MVC๊ตฌ์กฐ

MVC-Process ์ด๋ฏธ์ง€ ์ถœ์ฒ˜: Spring MVC Architecture

  • Dispatcher Servlet : ๋ชจ๋“  ์š”์ฒญ์„ ๋ฐ›์•„์„œ Controller์—๊ฒŒ ๋„˜๊ฒจ์ฃผ๋Š” ์—ญํ• ์„ ์ฃผ๋กœ ํ•จ
  • HandlerMapping : ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ URL์— ๋งคํ•‘๋˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์„ ํƒํ•˜๊ณ ,์„ ํƒ๋œ ํ•ธ๋“ค๋Ÿฌ(Handler)์™€ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ DispatcherServlet์— ๋ฐ˜ํ™˜ํ•˜๊ณ , DispatcherServlet์ด ์ปจํŠธ๋กค๋Ÿฌ์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์‹คํ–‰ ์ž‘์—…์„ HandlerAdapter์—๊ฒŒ ์œ„์ž„ํ•จ
  • HandlerAdapter : ์ปจํŠธ๋กค๋Ÿฌ์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ํ”„๋กœ์„ธ์Šค๋ฅผ ํ˜ธ์ถœํ•จ
  • ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์‹คํ–‰ํ•˜๊ณ , ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ชจ๋ธ์— ์„ค์ •ํ•œ ํ›„ ๋…ผ๋ฆฌ์  ์ด๋ฆ„์„ HandlerAdapter์— ๋ฐ˜ํ™˜ํ•จ
    ** ๋…ผ๋ฆฌ์  ์ด๋ฆ„ : ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ View์— ๋Œ€ํ•ด ์ฐธ์กฐํ•˜๋Š” ๋ฐฉ์‹์„ ๋งํ•จ. ๋…ผ๋ฆฌ์  ์ด๋ฆ„์€ ์‹ค์ œ View ํŒŒ์ผ(ex. test.html) ๊ฒฝ๋กœ๋‚˜ ํŒŒ์ผ๋ช…๊ณผ ์ง์ ‘์ ์œผ๋กœ ์ผ์น˜ํ•˜์ง€ ์•Š๊ณ ๋„ ๋Œ€์‹  View Resolver์— ์˜ํ•ด ํ•ด์„๋˜์–ด ์‹ค์ œ ๋ทฐ ๋ฆฌ์†Œ์Šค๋กœ ๋งคํ•‘๋จ.
  • ViewResolver๋Š” ๋ทฐ ์ด๋ฆ„์— ๋งคํ•‘๋œ ๋ทฐ๋ฅผ ๋ฐ˜ํ™˜ํ•จ
  • ๋ทฐ๋Š” ๋ชจ๋ธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ Œ๋”๋งํ•˜๊ณ  ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•จ.

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

DispatcherServlet์˜ ์—ญํ• ๊ณผ MVC

  • ์ปจํŠธ๋กค๋Ÿฌ(Controller) ์—ญํ• : DispatcherServlet์€ ์Šคํ”„๋ง MVC์—์„œ ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ(Front Controller) ํŒจํ„ด์„ ๊ตฌํ˜„ํ•˜๊ณ , ๋ชจ๋“  ์›น ์š”์ฒญ์€ ๋จผ์ € DispatcherServlet์„ ํ†ต๊ณผํ•˜๋Š”๋ฐ, ์ด๊ฑด MVC ํŒจํ„ด์˜ ์ปจํŠธ๋กค๋Ÿฌ ๋ถ€๋ถ„์— ํ•ด๋‹นํ•จ

  • ์š”์ฒญ ๋ผ์šฐํŒ…(Request Routing): DispatcherServlet์€ ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ์„ ๋ถ„์„ํ•˜๊ณ  ์ ์ ˆํ•œ ํ•ธ๋“ค๋Ÿฌ(Controller)์—๊ฒŒ ์š”์ฒญ์„ ์ „๋‹ฌํ•˜๊ณ , ์ด ๊ณผ์ •์—์„œ HandlerMapping์„ ์‚ฌ์šฉํ•˜์—ฌ ์š”์ฒญ URL์„ ์ฒ˜๋ฆฌํ•  ์ปจํŠธ๋กค๋Ÿฌ ๋ฉ”์†Œ๋“œ์™€ ๋งคํ•‘ํ•จ

  • ๋ชจ๋ธ๊ณผ ๋ทฐ์˜ ์„ ํƒ: ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•œ ํ›„, DispatcherServlet์€ ๋ฐ˜ํ™˜๋œ ์ •๋ณด(๋ชจ๋ธ)์™€ ๋ทฐ ์ด๋ฆ„์„ ๋ฐ”ํƒ•์œผ๋กœ ์‘๋‹ต์„ ์ƒ์„ฑํ•˜๋Š”๋ฐ, ViewResolver๋Š” ๋ทฐ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹ค์ œ ๋ทฐ๋ฅผ ๊ฒฐ์ •ํ•˜๊ณ , ๋ทฐ๋Š” ๋ชจ๋ธ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ตœ์ข…์ ์ธ ์‚ฌ์šฉ์ž ์‘๋‹ต์„ ๋ Œ๋”๋งํ•จ.

๐Ÿ”Ž MVC ํŒจํ„ด์„ ์™œ ์จ์•ผ ๋ ๊นŒ ?

MVCํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ์—๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

  1. Model, View, Controller๋กœ ๋ถ„๋ฆฌํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋…๋ฆฝ์ ์œผ๋กœ ๊ด€๋ฆฌ๋˜๊ณ  ์ˆ˜์ •๋  ์ˆ˜ ์žˆ์–ด, ์œ ์ง€๋ณด์ˆ˜์™€ ํ™•์žฅ์— ์šฉ์ดํ•˜๋‹ค.
  2. ๋ชจ๋ธ์€ ๋…๋ฆฝ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์žฌ์‚ฌ์šฉ์„ฑ ๋ฐ ์œ ์—ฐ์„ฑ์— ๋›ฐ์–ด๋‚˜๋‹ค. ๋™์ผํ•œ ๋กœ์ง์„ ์—ฌ๋Ÿฌ ์ธํ„ฐํŽ˜์ด์Šค์— ์‰ฝ๊ฒŒ ์ ์šฉ์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  3. ํ…Œ์ŠคํŠธํ•˜๊ธฐ๊ฐ€ ์šฉ์ดํ•˜๋‹ค.

MVCํŒจํ„ด์€ ์ด๋Ÿฌํ•œ ์ด์ ๋“ค๋กœ ์ธํ•˜์—ฌ ์˜ค๋žซ๋™์•ˆ ์ธ์ •๋ฐ›๊ณ  ์‚ฌ์šฉ๋˜์–ด ์™”๋‹ค.

๐Ÿค” MVC2๋Š” ๋ฌด์—‡์ธ๊ฐ€ ?

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

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

MVC์™€ MVC2๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค. MVC1

MVC

  • User -> JSP(View/Controller): ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์€ ๋ทฐ๋ฅผ ํ†ตํ•ด ๋“ค์–ด์˜ค๋ฉฐ, ๋ทฐ๋Š” ์ปจํŠธ๋กค๋Ÿฌ์˜ ๊ธฐ๋Šฅ์„ ์ผ๋ถ€ ์ˆ˜ํ–‰ํ•จ
  • Controller -> Model: ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋ชจ๋ธ์— ์š”์ฒญ์„ ์ „๋‹ฌํ•˜์—ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•จ
  • Model -> DB: ๋ชจ๋ธ์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์ƒํ˜ธ ์ž‘์šฉ์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ์ปจํŠธ๋กค๋Ÿฌ์— ๋ฐ˜ํ™˜ํ•จ.

MVC2

  • User -> Controller: ์‚ฌ์šฉ์ž์˜ ๋ชจ๋“  ์š”์ฒญ์€ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ํ†ตํ•ด ์ฒ˜๋ฆฌํ•จ
  • Controller -> Model: ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋ชจ๋ธ์— ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ์š”์ฒญํ•จ
  • Model -> DB: ๋ชจ๋ธ์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ƒํ˜ธ ์ž‘์šฉํ•˜์—ฌ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ์ปจํŠธ๋กค๋Ÿฌ์— ๋ฐ˜ํ™˜ํ•จ
  • Controller -> View: ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์ฒ˜๋ฆฌ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ทฐ์— ์ „๋‹ฌํ•˜์—ฌ ์‚ฌ์šฉ์ž์—๊ฒŒ ํ‘œ์‹œํ•จ

MVC์™€ MVC2์˜ ๋‹จ์ 

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

MVC2์˜ ๊ฒฝ์šฐ ์—ญํ• ์ด ๋ช…ํ™•ํ•˜๊ฒŒ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ๋‹ค๋ณด๋‹ˆ, ์œ ์ง€๋ณด์ˆ˜์™€ ํ™•์žฅ์„ฑ์ด ๋งค์šฐ ๋›ฐ์–ด๋‚˜๋ฉฐ, ์žฌ์‚ฌ์šฉ์„ฑ/ํ…Œ์ŠคํŠธ/ํšจ์œจ์ ์ธ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ ๋“ฑ ๋งŽ์€ ์žฅ์ ์ด ์žˆ๋‹ค. ๋‹จ์ ์€ ์ดˆ๊ธฐ ํ•™์Šต ๊ณก์„ ์ด ์กฐ๊ธˆ ๊ฐ€ํŒŒ๋ฅด๋ฉฐ, ๊ตฌํ˜„ ๋ณต์žก์„ฑ์ด ์žˆ๋‹ค.