Spring MVC๋?
Spring MVC๋ Spring Framework์์ ์ ๊ณตํ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์ ์ํ ์น ํ๋ ์์ํฌ์ด๋ค.
์ ํต์ ์ธ Model-View-Controller ํจํด์ ๊ธฐ๋ฐ์ผ๋ก ์น ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ์๋ต์ ์์ฑํ๋ ๊ตฌ์กฐ๋ก ์ค๊ณ๋์ด ์๋ค.
๋ง๋ค์ด์ง ๋ฐฐ๊ฒฝ
- ์๋ฐ ์ง์์์๋ ์ด์ฐฝ๊ธฐ์ JSP + Servlet ๊ธฐ๋ฐ์ ์น ๊ฐ๋ฐ์ด ์ฃผ๋ฅผ ์ด๋ค์ง๋ง, ์ฝ๋ ๋ถ๋ฆฌ์ ์ฌ์ฌ์ฉ์ฑ, ํ ์คํธ ์ด๋ ค์ ๋ฑ์ ๋ฌธ์ ๊ฐ ์์๋ค.
- Spring Framework๋ IoC, DI ๋ฑ์ ๊ฐ๋ ์ ๊ธฐ๋ฐ์ผ๋ก ๊ฒฝ๋ ํ๋ ์์ํฌ๋ก ๋ฑ์ฅํ๊ณ , ๊ทธ ์์ ์น ์์ฒญ ์ฒ๋ฆฌ ๊ตฌ์กฐ๋ก MVC ํจํด์ ์ ์ฉํ Spring MVC๊ฐ ํฌํจ๋์๋ค.
- ๋ณต์กํ๊ณ ๋ฌด๊ฑฐ์ด EJB ๋์ ๊ฐ๋ณ๊ณ ์ ์ฐํ ์น ๊ฐ๋ฐ์ ๊ฐ๋ฅํ๊ฒ ํ๊ธฐ ์ํด ๋์ ๋์๋ค.
ํน์ง
- DispatcherServlet ์ค์ฌ์ ์์ฒญ ์ฒ๋ฆฌ
- ๋ชจ๋ ์น ์์ฒญ์ DispatcherServlet์ด ๋ฐ์์ ์ ์ ํ ์ปจํธ๋กค๋ฌ๋ก ๋ผ์ฐํ ํจ
- ํธ๋ค๋ฌ ๋งคํ (HandlerMapping)
- ์ด๋ค ์์ฒญ์ ์ด๋ค ์ปจํธ๋กค๋ฌ๊ฐ ์ฒ๋ฆฌํ ์ง ๊ฒฐ์
- ํธ๋ค๋ฌ ์ด๋ํฐ (HandlerAdapter)
- ์ปจํธ๋กค๋ฌ ๋ฉ์๋ ์คํ์ ์ํ ์ด๋ํฐ ์ญํ
- ๋ชจ๋ธ๊ณผ ๋ทฐ ๋ถ๋ฆฌ
- ๋น์ฆ๋์ค ๋ก์ง(Model), ์์ฒญ ์ฒ๋ฆฌ(Controller), ํ๋ฉด ๋ ๋๋ง(View)์ด ๋ช ํํ ๋ถ๋ฆฌ๋จ
- ์ ์ฐํ ViewResolver
- JSP, Thymeleaf, JSON ๋ฑ ๋ค์ํ ํํ์ ๋ทฐ๋ฅผ ์ฒ๋ฆฌ ๊ฐ๋ฅ
- @Controller, @RequestMapping ๊ธฐ๋ฐ์ ์ ์ธ์ ๋ฐฉ์
- Annotation ๊ธฐ๋ฐ์ผ๋ก ์ปจํธ๋กค๋ฌ๋ฅผ ์ฝ๊ฒ ์ ์ํ๊ณ ์์ฒญ URL์ ๋งคํํ ์ ์์
- 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 | ๋ ผ๋ฆฌ์ ๋ทฐ ์ด๋ฆ → ๋ฌผ๋ฆฌ์ ๋ทฐ ๊ฒฝ๋ก๋ก ๋ณํ |
์ด๋ ธํ ์ด์ ๊ธฐ๋ฐ ์ ์ธ ๋ฐฉ์ | ์ค์ ์ ์ต์ํํ๊ณ ์ ์ธ์ ์ผ๋ก ์ปจํธ๋กค๋ฌ ๊ตฌ์ฑ |
์ ํจ์ฑ ๊ฒ์ฌ | ์ ๋ ฅ ๋ฐ์ดํฐ์ ๋ํ ๊ฒ์ฆ์ ์๋ ์ฒ๋ฆฌ ๊ฐ๋ฅ |
'Springboot' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring] Spring MVC: HandlerMapping (0) | 2025.05.31 |
---|---|
[Spring] Spring MVC: DispatcherServelt (0) | 2025.05.30 |
[Spring] ์๋ธ๋ฆฟ๊ณผ ํฐ์บฃ์ ๋ด๋ถ ๊ตฌ์กฐ (1) | 2025.05.17 |
[Springboot] Springboot์ ๋ด๋ถ ์๋ ์๋ฆฌ(With Log) (0) | 2025.05.17 |
๋ฐฑ์๋๋ฅผ ์์ํ๋ฉฐ... (0) | 2024.07.08 |