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

[Spring] Spring MVC

by ๋Œ€๋ณต2 2025. 5. 29.

Spring MVC๋ž€?

Spring MVC๋Š” Spring Framework์—์„œ ์ œ๊ณตํ•˜๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์„ ์œ„ํ•œ ์›น ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค.

์ „ํ†ต์ ์ธ Model-View-Controller ํŒจํ„ด์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์›น ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ์‘๋‹ต์„ ์ƒ์„ฑํ•˜๋Š” ๊ตฌ์กฐ๋กœ ์„ค๊ณ„๋˜์–ด ์žˆ๋‹ค.


๋งŒ๋“ค์–ด์ง„ ๋ฐฐ๊ฒฝ

  • ์ž๋ฐ” ์ง„์˜์—์„œ๋Š” ์ดˆ์ฐฝ๊ธฐ์— JSP + Servlet ๊ธฐ๋ฐ˜์˜ ์›น ๊ฐœ๋ฐœ์ด ์ฃผ๋ฅผ ์ด๋ค˜์ง€๋งŒ, ์ฝ”๋“œ ๋ถ„๋ฆฌ์™€ ์žฌ์‚ฌ์šฉ์„ฑ, ํ…Œ์ŠคํŠธ ์–ด๋ ค์›€ ๋“ฑ์˜ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค.
  • Spring Framework๋Š” IoC, DI ๋“ฑ์˜ ๊ฐœ๋…์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฒฝ๋Ÿ‰ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ ๋“ฑ์žฅํ–ˆ๊ณ , ๊ทธ ์•ˆ์— ์›น ์š”์ฒญ ์ฒ˜๋ฆฌ ๊ตฌ์กฐ๋กœ MVC ํŒจํ„ด์„ ์ ์šฉํ•œ Spring MVC๊ฐ€ ํฌํ•จ๋˜์—ˆ๋‹ค.
  • ๋ณต์žกํ•˜๊ณ  ๋ฌด๊ฑฐ์šด EJB ๋Œ€์‹  ๊ฐ€๋ณ๊ณ  ์œ ์—ฐํ•œ ์›น ๊ฐœ๋ฐœ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ๋„์ž…๋˜์—ˆ๋‹ค.

ํŠน์ง•

  1. DispatcherServlet ์ค‘์‹ฌ์˜ ์š”์ฒญ ์ฒ˜๋ฆฌ
    • ๋ชจ๋“  ์›น ์š”์ฒญ์€ DispatcherServlet์ด ๋ฐ›์•„์„œ ์ ์ ˆํ•œ ์ปจํŠธ๋กค๋Ÿฌ๋กœ ๋ผ์šฐํŒ…ํ•จ
  2. ํ•ธ๋“ค๋Ÿฌ ๋งคํ•‘ (HandlerMapping)
    • ์–ด๋–ค ์š”์ฒญ์„ ์–ด๋–ค ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์ฒ˜๋ฆฌํ• ์ง€ ๊ฒฐ์ •
  3. ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ (HandlerAdapter)
    • ์ปจํŠธ๋กค๋Ÿฌ ๋ฉ”์„œ๋“œ ์‹คํ–‰์„ ์œ„ํ•œ ์–ด๋Œ‘ํ„ฐ ์—ญํ• 
  4. ๋ชจ๋ธ๊ณผ ๋ทฐ ๋ถ„๋ฆฌ
    • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง(Model), ์š”์ฒญ ์ฒ˜๋ฆฌ(Controller), ํ™”๋ฉด ๋ Œ๋”๋ง(View)์ด ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌ๋จ
  5. ์œ ์—ฐํ•œ ViewResolver
    • JSP, Thymeleaf, JSON ๋“ฑ ๋‹ค์–‘ํ•œ ํ˜•ํƒœ์˜ ๋ทฐ๋ฅผ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ
  6. @Controller, @RequestMapping ๊ธฐ๋ฐ˜์˜ ์„ ์–ธ์  ๋ฐฉ์‹
    • Annotation ๊ธฐ๋ฐ˜์œผ๋กœ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์‰ฝ๊ฒŒ ์ •์˜ํ•˜๊ณ  ์š”์ฒญ URL์„ ๋งคํ•‘ํ•  ์ˆ˜ ์žˆ์Œ
  7. Validator, BindingResult๋ฅผ ํ†ตํ•œ ๊ฒ€์ฆ ์ฒ˜๋ฆฌ ์ง€์›
    • ํผ ๊ฒ€์ฆ ๋ฐ ์—๋Ÿฌ ์ฒ˜๋ฆฌ ์ง€์›

์žฅ์ 

์žฅ์  ์„ค๋ช…
๊ตฌ์กฐ์  ๋ช…ํ™•์„ฑ MVC ํŒจํ„ด์œผ๋กœ ๊ฐ ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ถ„๋ฆฌํ•จ
์œ ์—ฐํ•œ ์„ค์ • JavaConfig, XML, Annotation ๋“ฑ ๋‹ค์–‘ํ•œ ์„ค์ • ๋ฐฉ์‹ ์ง€์›
์Šคํ”„๋ง๊ณผ์˜ ํ†ตํ•ฉ DI, AOP, ํŠธ๋žœ์žญ์…˜ ๋“ฑ Spring์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ๊ทธ๋Œ€๋กœ ํ™œ์šฉ ๊ฐ€๋Šฅ
ํ™•์žฅ์„ฑ ์ธํ„ฐ์…‰ํ„ฐ, ํ•„ํ„ฐ, ์ปค์Šคํ…€ ํ•ธ๋“ค๋Ÿฌ ๋“ฑ ์œ ์—ฐํ•œ ํ™•์žฅ ๊ตฌ์กฐ ๋ณด์œ 

 

๋‹จ์ 

๋‹จ์  ์„ค๋ช…
์„ค์ • ๋ณต์žก์„ฑ DispatcherServlet, ViewResolver ๋“ฑ ์ดˆ๊ธฐ์— ๊ตฌ์„ฑํ•  ์š”์†Œ๊ฐ€ ๋งŽ์Œ
steep learning curve DI, Bean, Lifecycle ๋“ฑ Spring ์ „๋ฐ˜์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ํ•„์š”ํ•จ
์ดˆ๊ธฐ ์˜ค๋ฒ„ํ—ค๋“œ ์„ค์ • ๋ฐ ๊ตฌ์กฐํ™” ์ž‘์—…์ด ๊ฐ„๋‹จํ•œ CRUD์—๋Š” ๊ณผํ•  ์ˆ˜ ์žˆ์Œ

 


Spring MVC ์ฃผ์š” ๊ธฐ๋Šฅ๋ณ„ ๋™์ž‘ ์›๋ฆฌ

 

 

1. DispatcherServlet ์ค‘์‹ฌ์˜ ์š”์ฒญ ์ฒ˜๋ฆฌ

  • DispatcherServlet์€ Spring MVC์˜ ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•จ.
  • ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์€ web.xml ๋˜๋Š” Java Config์— ์„ค์ •๋œ DispatcherServlet์œผ๋กœ ์ง„์ž…ํ•จ.
  • ์š”์ฒญ ํ๋ฆ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Œ:
  • (์š”์ฒญ → DispatcherServlet → HandlerMapping → Controller → ModelAndView → ViewResolver → View)
  • DispatcherServlet์€ ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๋ฅผ ์กฐ์œจํ•˜๋Š” ์ค‘์•™ ํ—ˆ๋ธŒ ์—ญํ• 

2. HandlerMapping

  • ์–ด๋–ค URL ์š”์ฒญ์ด ์–ด๋–ค Controller์˜ ์–ด๋–ค ๋ฉ”์„œ๋“œ๋กœ ์—ฐ๊ฒฐ๋ ์ง€๋ฅผ ๊ฒฐ์ •ํ•จ.
  • Annotation ๊ธฐ๋ฐ˜์ผ ๊ฒฝ์šฐ, @RequestMapping, @GetMapping, @PostMapping ๋“ฑ์˜ ์–ด๋…ธํ…Œ์ด์…˜์ด ์ ์šฉ๋œ ๋ฉ”์„œ๋“œ๋ฅผ ํƒ์ƒ‰ํ•˜์—ฌ ํ•ธ๋“ค๋Ÿฌ๋กœ ๋“ฑ๋กํ•จ.
  • ๋‚ด๋ถ€์ ์œผ๋กœ RequestMappingHandlerMapping ํด๋ž˜์Šค๊ฐ€ ์ž‘๋™ํ•จ.
  • ์š”์ฒญ URL /hello → ํ•ด๋‹น ๋ฉ”์„œ๋“œ์™€ ๋งคํ•‘๋จ.
@GetMapping("/hello") 
public String hello() { ... }

 


3. HandlerAdapter

  • HandlerMapping์„ ํ†ตํ•ด ๊ฒฐ์ •๋œ ์ปจํŠธ๋กค๋Ÿฌ(=ํ•ธ๋“ค๋Ÿฌ ๊ฐ์ฒด)๋ฅผ ์‹ค์ œ๋กœ ํ˜ธ์ถœ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ๋Š” ์–ด๋Œ‘ํ„ฐ.
  • ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์˜ ์ปจํŠธ๋กค๋Ÿฌ ๊ตฌํ˜„์ฒด๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด HandlerAdapter๊ฐ€ ํ•„์š”ํ•จ.
  • ์ผ๋ฐ˜์ ์œผ๋กœ @Controller๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ์—๋Š” RequestMappingHandlerAdapter๊ฐ€ ์‚ฌ์šฉ๋จ.

4. ๋ชจ๋ธ๊ณผ ๋ทฐ ๋ถ„๋ฆฌ

  • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง(Model), ๋ทฐ(View), ์š”์ฒญ ์ฒ˜๋ฆฌ(Controller)๋ฅผ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌํ•˜์—ฌ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ด.
  • Model์€ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์•„ View์— ์ „๋‹ฌํ•˜๋Š” ๊ฐ์ฒด.
  • View๋Š” JSP, Thymeleaf, JSON ๋“ฑ ๊ฒฐ๊ณผ๋ฅผ ํ™”๋ฉด์— ์ถœ๋ ฅํ•˜๋Š” ๋ถ€๋ถ„.
model.addAttribute("data", data); // View๋กœ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ 
return "viewName"; // ViewResolver๊ฐ€ viewName์— ํ•ด๋‹นํ•˜๋Š” ์‹ค์ œ ๋ทฐ๋ฅผ ์ฐพ์Œ

 


5. ์œ ์—ฐํ•œ ViewResolver

  • ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋ฆฌํ„ดํ•œ ๋…ผ๋ฆฌ์ ์ธ ๋ทฐ ์ด๋ฆ„์„ ์‹ค์ œ ๋ทฐ ํŒŒ์ผ ๊ฒฝ๋กœ๋กœ ๋ณ€ํ™˜ํ•จ.
  • ์˜ˆ: return "hello" → /WEB-INF/views/hello.jsp๋กœ ๋ณ€ํ™˜
  • Thymeleaf, JSON ๋ทฐ(JSONView), PDF ๋“ฑ ๋‹ค์–‘ํ•œ View ํƒ€์ž…๋„ ์ง€์› ๊ฐ€๋Šฅ.
  • Spring MVC์—์„œ๋Š” @ResponseBody๋‚˜ @RestController๋ฅผ ์“ฐ๋ฉด ViewResolver๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  JSON ์ž์ฒด๋ฅผ ์‘๋‹ต์œผ๋กœ ์ง๋ ฌํ™”(HttpMessageConverter)ํ•ด์„œ ๋ฐ˜ํ™˜ํ•ด. ์ด๊ฒŒ ๋ฐ”๋กœ REST API ์‘๋‹ต
InternalResourceViewResolver resolver = new InternalResourceViewResolver(); 
resolver.setPrefix("/WEB-INF/views/"); 
resolver.setSuffix(".jsp");

6. @Controller, @RequestMapping ๊ธฐ๋ฐ˜์˜ ์„ ์–ธ์  ๋ฐฉ์‹

  • ๊ณผ๊ฑฐ XML ์„ค์ • ๊ธฐ๋ฐ˜์˜ ๋งคํ•‘ ๋ฐฉ์‹ ๋Œ€์‹ , Annotation ๊ธฐ๋ฐ˜์œผ๋กœ ์„ ์–ธ์ ์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Œ.
    ์ฃผ์š” ์–ด๋…ธํ…Œ์ด์…˜ ์–ด๋…ธํ…Œ์ด์…˜ ์„ค๋ช…
    @Controller ํ•ด๋‹น ํด๋ž˜์Šค๊ฐ€ ์ปจํŠธ๋กค๋Ÿฌ ์—ญํ• ์„ ํ•œ๋‹ค๊ณ  Spring์— ์•Œ๋ฆผ
    @RequestMapping URL, HTTP Method ๋งคํ•‘
    @GetMapping GET ์š”์ฒญ ์ „์šฉ ๋งคํ•‘
    @PostMapping POST ์š”์ฒญ ์ „์šฉ ๋งคํ•‘
  • Spring์ด ๋ถ€ํŒ…๋  ๋•Œ ์Šค์บ”ํ•˜์—ฌ ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•˜๊ณ , URL ์š”์ฒญ ์‹œ ํ•ด๋‹น ๋ฉ”์„œ๋“œ ์‹คํ–‰.

7. Validator, BindingResult๋ฅผ ํ†ตํ•œ ๊ฒ€์ฆ ์ฒ˜๋ฆฌ

  • @Valid ๋˜๋Š” @Validated๋ฅผ ํ†ตํ•ด DTO์— ๋Œ€ํ•œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•จ.
  • ๊ฒ€์‚ฌ ๊ฒฐ๊ณผ๋Š” BindingResult์— ๋‹ด๊น€.
  • ๊ฒ€์ฆ ์‹คํŒจ ์‹œ ์ปจํŠธ๋กค๋Ÿฌ ๋‚ด๋ถ€์—์„œ ๋ฐ”๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ.
  • ๊ฒ€์ฆ ์–ด๋…ธํ…Œ์ด์…˜ ์˜ˆ์‹œ: @NotNull, @Size, @Email, @Pattern ๋“ฑ
public String submit(@Valid @ModelAttribute Form form, BindingResult result) { 
	if (result.hasErrors()) { 
    	return "form"; // ๊ฒ€์ฆ ์‹คํŒจ ์‹œ ๋‹ค์‹œ ํผ์œผ๋กœ 
    } 
    // ๊ฒ€์ฆ ์„ฑ๊ณต ๋กœ์ง
}
๊ธฐ๋Šฅ ๋™์ž‘ ์›๋ฆฌ ์š”์•ฝ
DispatcherServlet ๋ชจ๋“  ์š”์ฒญ์˜ ์ง„์ž…์ , ํ๋ฆ„์„ ์กฐ์œจํ•˜๋Š” ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ
HandlerMapping ์š”์ฒญ URL → ์–ด๋–ค ์ปจํŠธ๋กค๋Ÿฌ ๋ฉ”์„œ๋“œ์ธ์ง€ ๋งคํ•‘
HandlerAdapter ๋งคํ•‘๋œ ๋ฉ”์„œ๋“œ๋ฅผ ์‹ค์ œ๋กœ ์‹คํ–‰ํ•˜๋Š” ์–ด๋Œ‘ํ„ฐ
๋ชจ๋ธ๊ณผ ๋ทฐ ๋ถ„๋ฆฌ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ์™€ UI ๋ Œ๋”๋ง์„ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌ
ViewResolver ๋…ผ๋ฆฌ์  ๋ทฐ ์ด๋ฆ„ → ๋ฌผ๋ฆฌ์  ๋ทฐ ๊ฒฝ๋กœ๋กœ ๋ณ€ํ™˜
์–ด๋…ธํ…Œ์ด์…˜ ๊ธฐ๋ฐ˜ ์„ ์–ธ ๋ฐฉ์‹ ์„ค์ •์„ ์ตœ์†Œํ™”ํ•˜๊ณ  ์„ ์–ธ์ ์œผ๋กœ ์ปจํŠธ๋กค๋Ÿฌ ๊ตฌ์„ฑ
์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ๊ฒ€์ฆ์„ ์ž๋™ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ