[Spring] MVC ๋ชจ๋ธ

ํ˜œ์ฟฐยท2023๋…„ 9์›” 7์ผ
0
post-thumbnail

์†Œ์Šค์ฝ”๋“œ : https://github.com/junghyeyoun/spring -> sprweb2,3

๐Ÿ“Œ ๊ฐœ๋…

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

๐Ÿ“• Model

๋ชจ๋ธ์€ ์‹œ์Šคํ…œ์—์„œ ๋น„์ง€๋‹ˆ์Šค ๋กœ์ง์˜ ๋‚ด์šฉ์„ ์ž‘์„ฑํ•˜๋Š” ์—ญํ• ์ด๋‹ค.

๐Ÿ“• View

๋ทฐ๋Š” ํ•œ๋งˆ๋””๋กœ ์™ธํ˜•์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. ์‚ฌ์šฉ์ž ์ž…๋ ฅ๊ณผ ๊ฒฐ๊ณผ ์ถœ๋ ฅ ๋“ฑ ์‹œ์Šคํ…œ์—์„œ ํ‘œํ˜„ ๋ถ€๋ถ„์„ ๋‹ด๋‹นํ•˜๋ฉฐ ์›น์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ์ฃผ๋กœ ํ™”๋ฉด์„ ๋‹ด๋‹นํ•œ๋‹ค.

๐Ÿ“• Controller

์ปจํŠธ๋กค๋Ÿฌ๋Š” ์„œ๋น„์Šค ์ฒ˜๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๋ชจ๋ธ๊ณผ ํ™”๋ฉด ํ‘œ์‹œ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๋ทฐ๋ฅผ ์ œ์–ดํ•˜๋Š ์—ญํ• ์„ ํ•œ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๋‚ด์šฉ์„ ๋ทฐ์—์„œ ๋ฐ›๊ณ , ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ชจ๋ธ์— ๋‚ด์šฉ์„ ์ „๋‹ฌํ•œ๋‹ค. ๋˜ ๋ชจ๋ธ์—์„œ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ทฐ์— ์ „๋‹ฌํ•ด์„œ ํ™”๋ฉด์— ํ‘œ์‹œํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

๐Ÿ“Œ ์Šคํ”„๋ง MVC ๊ตฌ์„ฑ์š”์†Œ

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

๐Ÿ“• DispatcherServlet

DispatcherServlet์—์„œ๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ๋ชจ๋“  ์š”์ฒญ์„ ํ•œ ๊ณณ์œผ๋กœ ๋ฐ›์•„์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. ์ฆ‰, ์„œ๋ฒ„ ๊ฐ€์žฅ ์•ž๋‹จ์—์„œ ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์„ ๊ฐ€์žฅ ๋จผ์ € ๋ฐ›์•„ ์š”์ฒญ์— ์•Œ๋งž๋Š” Hendler, ์ฆ‰ Controller์—์„œ ์œ„์ž„ํ•ด์ฃผ๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

Handler์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๋Š” HTTP Response ํ˜•ํƒœ๋กœ ๋งŒ๋“ค์–ด์„œ ๋‹ค์‹œ ๋ฐ˜ํ™˜์„ ํ•œ๋‹ค. ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์€ Dispatcher Servlet์—์„œ ์‹œ์ž‘ํ•ด์„œ Dispatcher Servlet์—์„œ ๋๋‚œ๋‹ค.

์ˆœ์„œ
1. ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์ด Dispatcher Servlet์œผ๋กœ ์ „๋‹ฌ๋œ๋‹ค.
2. Handler Mapping ๋˜๋Š” Controller ์— ์ „๋‹ฌ์„ ํ•œ๋‹ค.
3. ์ฒ˜๋ฆฌ๋œ ๊ฒฐ๊ณผ ๊ฐ’์„ Model ํ˜•ํƒœ๋กœ Dispatcher์— ๋ฐ˜ํ™˜ํ•œ๋‹ค.
4. ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ฃผ๊ณ ์ž ํ•˜๋Š” View ํ˜•ํƒœ๋กœ ViewResolver๊ฐ€ Page๋ฅผ ์ƒ์„ฑ์„ ํ•˜๊ณ , ์ด๋Ÿฌํ•œ Page ๊ฐ’์— Model์„ ํฌํ•จ์‹œ์ผœ์„œ ์ „๋‹ฌ์„ ํ•˜๊ฒŒ ๋œ๋‹ค.

๐Ÿ“• RestController

Spring MVC Application์—์„œ๋Š” ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์ผ๋ฐ˜์ ์œผ๋กœ ํด๋ž˜์Šค๋ฅผ ์Šคํ”„๋ง ์„ค์ •ํŒŒ์ผ์— ๋“ฑ๋กํ•ด์„œ ์‚ฌ์šฉํ•˜์˜€๋‹ค. Spring 4.x ๋ฒ„์ „๋ถ€ํ„ฐ๋Š” xml ํŒŒ์ผ์— ์„ค์ •์ •๋ณด๋ฅผ ๋“ฑ๋กํ•˜์ง€ ์•Š๊ณ , Annotation์„ ์ด์šฉํ•˜์—ฌ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›์„ ํ•˜๊ณ  ์žˆ๋‹ค.

RestController๋Š” Spring 4.x ๋ถ€ํ„ฐ ์ง€์›ํ•œ๋‹ค. Spring Web์—์„œ๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ง€๋Š” View๊ฐ€ ์—†๋Š” ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ RestController๋ผ๊ณ  ํ•œ๋‹ค. ์ฆ‰ View, Page ํ˜•ํƒœ๊ฐ€ ์•„๋‹Œ, JSon, XML ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜์„ ํ•˜๊ฒŒ ๋œ๋‹ค.(View๊ฐ€ ์—†๋Š” Rest Data ํ˜•ํƒœ)

ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์ด DispatcherServlet์œผ๋กœ ์ „๋‹ฌ์ด ๋˜๊ณ , DispatcherServlet์€ HandlerMapping๊ณผ REST controller์— ์š”์ฒญ์„ ์ „๋‹ฌํ•˜๊ณ , HandlerMapping์—์„œ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฐ”๋กœ ์‘๋‹ต์„ ์ „๋‹ฌํ•œ๋‹ค. REST Controller๋Š” @Controller์™€ @ResponseBody์˜ ๊ธฐ๋Šฅ์„ ๋ชจ๋‘ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹œ๋ฉด ๋œ๋‹ค.

๐Ÿ“Œ MVC ๊ด€๋ จ annotation

@Controller : ์ „ํ†ต์ ์ธ ์Šคํ”„๋ง์˜ ์ปจํŠธ๋กค๋Ÿฌ๋กœ, ์ฃผ๋กœ ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌ(๋ชจ๋ธ์„ ๊ฒฝ์œ ) ํ•œ ํ›„ ์ง€์ •๋œ ๋ทฐ์— ๋ชจ๋ธ ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. ํด๋ผ์ด์–ธํŠธ์™€ ๋ฐ์ดํ„ฐ ์ž…์ถœ๋ ฅ์„ ์ œ์–ดํ•˜๋Š” ํด๋ž˜์Šค์ด๋‹ค.
@RestController : json๊ณผ xml ํ˜•ํƒœ๋กœ ๊ฐ์ฒด ๋ฐ์ดํ„ฐ ๋ฐ˜ํ™˜์„ ๋ชฉ์ ์œผ๋กœ ํ•œ๋‹ค.
@GetMapping : get ์š”์ฒญ ์ฒ˜๋ฆฌ์šฉ ์ „์šฉ annotation์ด๋‹ค.
@PostMapping : post ์š”์ฒญ ์ฒ˜๋ฆฌ์šฉ ์ „์šฉ annotation์ด๋‹ค.
@RequestMapping : DispatcherServlet์œผ๋กœ ๋ถ€ํ„ฐ ์œ„์ž„๋ฐ›์€ HandlerMapping์— ์˜ํ•ด ์ฒ˜๋ฆฌํ•œ๋‹ค. get๊ณผ post๋ฐฉ์‹ ๋‘˜๋‹ค ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
@ResponseBody : String, MAP, JSON ๋“ฑ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•œ๋‹ค. ajax์—์„œ ๋งŽ์ด ์“ฐ์ธ๋‹ค.

์ฐธ๊ณ 
์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ ์ฒซ๊ฑธ์Œ - ์ฃผ์‹ํšŒ์‚ฌ ํ›„๋ฃจ๋„ค์Šค ํ‚ค๋…ธ์‹œํƒ€ ๋งˆ์‚ฌ์•„ํ‚ค ์ง€์Œ, ์ „๋ฏผ์ˆ˜ ์˜ฎ๊ฐ
https://shreysharma.com/mvc-architecture/ (mvc์ด๋ฏธ์ง€)
https://sonseungha.tistory.com/577 (DispatcherServlet)

0๊ฐœ์˜ ๋Œ“๊ธ€