Spring MVC ๊ตฌ์กฐ ํ๋ฆ
์คํ๋ง MVC๋ Model-View-Controller ๋์์ธ ํจํด์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ์น ํ๋ ์์ํฌ๋ก, ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ฑ ์์๋ฅผ ๋ช ํํ ๋ถ๋ฆฌํ์ฌ ์ ์ง๋ณด์์ฑ๊ณผ ํ์ฅ์ฑ์ ๋์ธ๋ค.
๊ธฐ๋ฅ๊ณผ ์ญํ ๋ณ๋ก ๋ชจ๋์ ๋๋๊ณ ๊ฐ ๋ชจ๋๋ค์ด ํ๋ ฅํ์ฌ ํด๋ผ์ด์ธํธํํ ์จ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ์๋ต์ ๋ณด๋ด์ฃผ๊ฒ ๋๋ค.
๊ทธ ์ค DispatcherServlet์ ์คํ๋ง ํ๋ ์์ํฌ์ ํต์ฌ ๊ตฌ์ฑ ์์๋ก, ์คํ๋ง MVC์ ํ๋ก ํธ ์ปจํธ๋กค๋ฌ(Front Controller) ์ญํ ์ ํ๋ค. ๋ชจ๋ HTTP ์์ฒญ์ ๋จผ์ DispatcherServlet์ ํตํด ์ฒ๋ฆฌ๋๋ฉฐ, ์ด๊ณณ์์ ์์ฒญ์ ์ ์ ํ ์ปจํธ๋กค๋ฌ, ์๋น์ค, ๋ทฐ๋ก ๋ผ์ฐํ ํ๋ค. DispatcherServlet์ ์คํ๋ง ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค์ ์ ์ด ์ง์ ์ผ๋ก, ์์ฒญ์ ์ฒ๋ฆฌ ํ๋ฆ์ ๊ด๋ฆฌํ๋ค.
์คํ๋ง MVC ๊ฐ ๋ชจ๋๋ณ ์์ฒญ ์ฒ๋ฆฌ ํ๋ฆ
- ํด๋ผ์ด์ธํธ ์์ฒญ (Client Request)
- ํด๋ผ์ด์ธํธ(๋ธ๋ผ์ฐ์ , ๋ชจ๋ฐ์ผ ์ฑ ๋ฑ)๊ฐ ํน์ URL๋ก HTTP ์์ฒญ์ ๋ณด๋ธ๋ค.
- ๋์คํจ์ฒ ์๋ธ๋ฆฟ (DispatcherServlet)
- ์์ฒญ์ ๋จผ์ DispatcherServlet์ ๋๋ฌํ๋ค. ์ด๋ ์คํ๋ง MVC์ ํ๋ก ํธ ์ปจํธ๋กค๋ฌ ์ญํ ์ ํ๋ฉฐ, ๋ชจ๋ ์์ฒญ์ ์ค์์์ ์ฒ๋ฆฌํ๋ค.
- DispatcherServlet์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ web.xml ํ์ผ ๋๋ ์คํ๋ง ๋ถํธ์ ์๋ ์ค์ ์ ์ํด ์ค์ ๋๋ค.
- ํธ๋ค๋ฌ ๋งคํ (Handler Mapping)
- DispatcherServlet์ ์์ฒญ URL์ ๊ธฐ๋ฐ์ผ๋ก ์ ์ ํ ์ปจํธ๋กค๋ฌ(Handler)๋ฅผ ์ฐพ๊ธฐ ์ํด ์ฌ๋ฌ ํธ๋ค๋ฌ ๋งคํ ์ ๋ต์ ์ฌ์ฉํ๋ค.
- ์คํ๋ง MVC๋ ๋ค์ํ ํธ๋ค๋ฌ ๋งคํ์ ์ ๊ณตํ๋ค. ์๋ฅผ ๋ค์ด, RequestMappingHandlerMapping์ @RequestMapping ์ ๋ ธํ ์ด์ ์ ๊ธฐ๋ฐ์ผ๋ก ์ปจํธ๋กค๋ฌ ๋ฉ์๋๋ฅผ ๋งคํํ๋ค.
- ํธ๋ค๋ฌ ์ด๋ํฐ (Handler Adapter)
- ํธ๋ค๋ฌ ๋งคํ์ ์ํด ์ ํ๋ ์ปจํธ๋กค๋ฌ๋ฅผ ์คํํ๊ธฐ ์ํด DispatcherServlet์ ์ ์ ํ ํธ๋ค๋ฌ ์ด๋ํฐ๋ฅผ ์ ํํ๋ค.
- ํธ๋ค๋ฌ ์ด๋ํฐ๋ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ์ค์ ์ปจํธ๋กค๋ฌ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ์ญํ ์ ํ๋ค. Spring MVC๋ ์ฌ๋ฌ ์ ํ์ ์ปจํธ๋กค๋ฌ๋ฅผ ์ง์ํ๊ธฐ ๋๋ฌธ์, ๊ฐ ์ปจํธ๋กค๋ฌ ํ์ ์ ๋ง๋ ํธ๋ค๋ฌ ์ด๋ํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ปจํธ๋กค๋ฌ๋ฅผ ์คํํ๋ค.
- ํธ๋ค๋ฌ ์ด๋ํฐ๋ ์ปจํธ๋กค๋ฌ๋ฅผ ํธ์ถํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ค.
- ์ปจํธ๋กค๋ฌ (Controller)
- ์ปจํธ๋กค๋ฌ๋ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ , ํ์ํ ๋น์ฆ๋์ค ๋ก์ง์ ์ํํ๋ฉฐ, ๋ชจ๋ธ ๋ฐ์ดํฐ๋ฅผ ์ค๋นํ๋ค.
- ์ปจํธ๋กค๋ฌ๋ @Controller ๋๋ @RestController ์ ๋ ธํ ์ด์ ์ ์ฌ์ฉํ์ฌ ์ ์๋๋ค.
@Controller @RequestMapping("/users") public class UserController { @Autowired private UserService userService; @GetMapping("/{id}") public String getUser(@PathVariable Long id, Model model) { User user = userService.getUserById(id); model.addAttribute("user", user); return "userDetail"; } }
- ๋ชจ๋ธ (Model)
- ๋ชจ๋ธ์ ์ปจํธ๋กค๋ฌ์ ์ํด ์ค๋น๋ ๋ฐ์ดํฐ๋ก, ๋ทฐ์ ์ ๋ฌ๋ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ๋ค.
- Model ๋๋ ModelMap ๊ฐ์ฒด๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ๋ทฐ์ ์ ๋ฌํ๋ค.
- ๋ทฐ ๋ฆฌ์กธ๋ฒ (View Resolver)
- ์ปจํธ๋กค๋ฌ๊ฐ ๋ฐํํ ๋ ผ๋ฆฌ์ ๋ทฐ ์ด๋ฆ์ ์ค์ ๋ทฐ ๊ฐ์ฒด๋ก ๋ณํํ๊ธฐ ์ํด DispatcherServlet์ ๋ทฐ ๋ฆฌ์กธ๋ฒ๋ฅผ ์ฌ์ฉํ๋ค.
- ์คํ๋ง MVC๋ ์ฌ๋ฌ ๋ทฐ ๋ฆฌ์กธ๋ฒ๋ฅผ ์ง์ํ๋ฉฐ, ์ฃผ๋ก InternalResourceViewResolver (JSP), ThymeleafViewResolver (Thymeleaf), FreeMarkerViewResolver (FreeMarker) ๋ฑ์ ์ฌ์ฉํ๋ค.
- DTO(Data Transfer Object)๋ฅผ ์ฌ์ฉํ์ฌ ObjectMapper (์ค๋ธ์ ํธ ๋งคํผ)๋ฅผ ํตํด JSON ์๋ต์ผ๋ก ๋ณด๋ด๋ ๊ฒฝ์ฐ, ๋ทฐ ๋ฆฌ์กธ๋ฒ ๊ณผ์ ์ ์๋ต๋๋ค.
<!-- ์คํ๋ง ์ค์ ํ์ผ --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/"/> <property name="suffix" value=".jsp"/> </bean>
- ๋ทฐ (View)
- ๋ทฐ๋ ๋ชจ๋ธ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํด๋ผ์ด์ธํธ์๊ฒ ๋ณด๋ผ HTML, JSON, XML ๋ฑ์ ์๋ต์ ์์ฑํ๋ค.
- JSP, Thymeleaf, FreeMarker ๋ฑ์ ํ ํ๋ฆฟ ์์ง์ ์ฌ์ฉํ์ฌ ๋ทฐ๋ฅผ ๊ตฌํํ๋ค.
<html> <body> <h1>User Detail</h1> <p>ID: ${user.id}</p> <p>Name: ${user.name}</p> <p>Email: ${user.email}</p> </body> </html>
- ์๋ต ๋ฐํ (Response Return)
- ์ต์ข ์ ์ผ๋ก ๋ทฐ์์ ์์ฑ๋ ์๋ต์ด DispatcherServlet์ ํตํด ํด๋ผ์ด์ธํธ์๊ฒ ๋ฐํ๋๋ค.
์์ฝ
- ํด๋ผ์ด์ธํธ ์์ฒญ: ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ์์ฒญ์ ๋ณด๋ธ๋ค.
- ๋์คํจ์ฒ ์๋ธ๋ฆฟ: ์์ฒญ์ ๋ฐ์ ์ ์ ํ ํธ๋ค๋ฌ๋ฅผ ์ฐพ๊ณ ์คํํ๋ค.
- ํธ๋ค๋ฌ ๋งคํ: ์์ฒญ URL์ ๋งคํ๋ ์ปจํธ๋กค๋ฌ๋ฅผ ์ฐพ๋๋ค.
- ํธ๋ค๋ฌ ์ด๋ํฐ: ์ปจํธ๋กค๋ฌ๋ฅผ ์คํํ๋ ๋ฐฉ๋ฒ์ ์ ์ํ๋ค.
- ์ปจํธ๋กค๋ฌ: ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ๋ชจ๋ธ ๋ฐ์ดํฐ๋ฅผ ์ค๋นํ๋ค.
- ๋ชจ๋ธ: ๋ทฐ์ ์ ๋ฌ๋ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ๋ค.
- ๋ทฐ ๋ฆฌ์กธ๋ฒ: ๋ ผ๋ฆฌ์ ๋ทฐ ์ด๋ฆ์ ์ค์ ๋ทฐ๋ก ๋ณํํ๋ค.
- ๋ทฐ: ๋ชจ๋ธ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์๋ต์ ์์ฑํ๋ค.
- ์๋ต ๋ฐํ: ์์ฑ๋ ์๋ต์ด ํด๋ผ์ด์ธํธ์๊ฒ ๋ฐํํ๋ค.
๋๊ธ