1. Spring MVC ํจํด์ด๋?
Spring MVC๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋ชจ๋์ด๋ค. Spring MVC๋ ์๋ธ๋ฆฟ(Servlet) API๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ์ฌ ์์ฒญ์ ์ฒ๋ฆฌํ๋๋ฐ, ์ด ๊ตฌ์กฐ๋ฅผ ํตํด ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ชจ๋ํํ๊ณ ์ ์ง๋ณด์๋ฅผ ์ฉ์ดํ๊ฒ ๋ง๋ค์ด์ค๋ค.
์ฐ์ Spring MVC ์ ๋ค์ด๊ฐ๊ธฐ ์์ด ๊ธฐ๋ณธ์ ์ธ MVCํจํด์ ๋ํด ์์๋ณด์. ์ด MVCํจํด์์ ๋ฐ์ ํ ๊ฒ์ด Spring MVC ์ด๋ค. MVC ํจํด์ ํฌ๊ฒ 3๊ฐ์ง ์ฃผ์ ๋ถ๋ถ์ผ๋ก ๋๋์ด์ ธ ์๋ค.
๐ฉ MVC ํจํด์ ์ฌ์ฉํ๋ ์ด์ ?
์ฌ์ฉ์๊ฐ ๋ณด๋ ํ์ด์ง, ๋ฐ์ดํฐ ์ฒ๋ฆฌ, ๊ทธ๋ฆฌ๊ณ ์ด ๋์ ์ค๊ฐ์์ ์ ์ดํ๋ ์ปจํธ๋กค๋ฌ๋ก ๊ฐ ์ปดํฌ๋ํธ๊ฐ ์๋ก ๋ถ๋ฆฌ๋์ด ์์คํ
๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ ์ ์๋ค. ๋ํ, ์ ์ง๋ณด์๊ฐ ์ฌ์ฐ๋ฉฐ, ์ค๋ณต์ฝ๋๋ฅผ ์ ๊ฑฐํ ์ ์๊ณ , ์ ํ๋ฆฌ์ผ์ด์
์ ํ์ฅ์ฑ ๋ฐ ์ ์ฐ์ฑ์ด ์ฆ๊ฐํ๋ค.
2. MVCํจํด์ ๊ตฌ์กฐ
๐ Model (๋ชจ๋ธ)
โถ ๋ฐ์ดํฐ๋ ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ๋ ๋ถ๋ถ
โถ ์๋ฅผ ๋ค์ด, ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๊ฑฐ๋ ์ฒ๋ฆฌํ๋ ์ญํ
๐ View (๋ทฐ)
โถ ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ง๋ ํ๋ฉด์ ๋ด๋นํ๋ ๋ถ๋ถ
โถ HTML, JSP, Thymeleaf ๋ฑ์ผ๋ก ์น ํ์ด์ง๋ฅผ ๋ง๋ค์ด ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ค๋ค.
๐ Controller (์ปจํธ๋กค๋ฌ)
โถ ์ฌ์ฉ์์ ์์ฒญ์ ๋ฐ๊ณ , ์ด๋ฅผ ์ฒ๋ฆฌํ ํ Model๊ณผ View๋ฅผ ์ฐ๊ฒฐํด์ฃผ๋ ์ญํ
โถ ์ฌ์ฉ์๊ฐ ์ด๋ค ๋์์ ํ๋ฉด, ๊ทธ์ ๋ง๋ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ View์ ์ ๋ฌํด์ ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ฃผ๋ ๋ฐฉ์์ผ๋ก ๋์ํ๋ค.
โญ Spring MVC ํ๋ฆ
์ฌ์ฉ์๊ฐ ์น ํ์ด์ง์์ ์์ฒญ์ ๋ณด๋ โ Controller๊ฐ ์ด ์์ฒญ์ ๋ฐ์์ ํ์ํ Model์ ํธ์ถ โ Model์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ณ , ๊ฒฐ๊ณผ๋ฅผ Controller์ ์ ๋ฌ โ Controller๋ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ View์ ์ ๋ฌํด ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ค
Controller๋ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ฐ์ ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ๊ณ , ์ฒ๋ฆฌ๋ ๋ฐ์ดํฐ๋ฅผ Model์ ๋ด์ View์ ์ ๋ฌํ๋ ์ค๊ฐ ๋ค๋ฆฌ ์ญํ ์ ํ๋ค. ์ด ๊ณผ์ ์์ Model์ ๋ฐ์ดํฐ์ ์ํ๋ฅผ ๊ด๋ฆฌํ๊ณ , View๋ ์ฌ์ฉ์์๊ฒ ๊ทธ ๋ฐ์ดํฐ๋ฅผ ์๊ฐ์ ์ผ๋ก ํ์ํ๋ค.
2-1. Model (๋ชจ๋ธ)
๐ฅ Model์ ์น ์ ํ๋ฆฌ์ผ์ด์
์์ ๋ฐ์ดํฐ์ ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ๋ ํต์ฌ ๋ถ๋ถ์ผ๋กController์์ ์ฒ๋ฆฌํ ๊ฒฐ๊ณผ๋ฅผ ๋ด์ View์ ์ ๋ฌํ๋ค.
1) ๋ฐ์ดํฐ๊ฐ์ฒด
๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๊ฐ์ ธ์จ ์ํฐํฐ(Entity)๋ DTO(Data Transfer Object) ๊ฐ์ ๊ตฌ์กฐ์ฒด๊ฐ Model์์ ๋ค๋ค์ง๋ค. ์ด๋ฐ ๋ฐ์ดํฐ ๊ฐ์ฒด๋ค์ ์ปจํธ๋กค๋ฌ์์ ์ฒ๋ฆฌ๋ ํ, View์ ์ ๋ฌ๋์ด ์ฌ์ฉ์๊ฐ ๋ณผ ์ ์๋ ํํ๋ก ๋ณํ๋๋ค.
public class User {
private String name;
private String email;
// Getters and Setters
}
2) data (database)
๋ชจ๋ธ์ ํด๋ผ์ด์ธํธ์ ๋ ธ์ถ๋์ง ์๋๋ค. ์ฐ์ฐ์ฒ๋ฆฌ ๋ฐ DB๊ฐ ์ฃผ ๋ ๋ชฉ์ , ์ปจํธ๋กค๋ฌ์์ ์์ฒญ์ด ์ค๋ฉด ํด๋น ์ฐ์ฐ์ฒ๋ฆฌ ํ ์ ๋ณด๋ฅผ return
2-2. View (๋ทฐ)
View๋ Model์์ ์ ๋ฌ๋ ๋ฐ์ดํฐ๋ฅผ ํ๋ฉด์ ํ์ํ๊ณ , ์ฌ์ฉ์์์ ์ํธ์์ฉ์ ์ฒ๋ฆฌํ๋ ์ญํ ์ ํ๋ค. (UI / UX) ๐จโ๐ป ์ฃผ๋ก HTML, JSP, Thymeleaf ๊ฐ์ ํ
ํ๋ฆฟ์ ์ฌ์ฉํ์ฌ ํ๋ฉด์ ๊ตฌ์ฑํ๋ค.
1) ๋ฐ์ดํฐ ํ์
Model์์ ์ ๋ฌ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ํ๋ฉด์ ํ์ํ๋ค. ์๋ฅผ ๋ค์ด, ์ฌ์ฉ์ ์ด๋ฆ, ์ ํ ๋ชฉ๋ก, ์ฃผ๋ฌธ ์ ๋ณด ๋ฑ์ HTML ํ ์ด๋ธ์ด๋ ํผ์ผ๋ก ๋ํ๋ธ๋ค.
<h1>Welcome, ${user.name}</h1>
<p>Email: ${user.email}</p>
2) ์ฌ์ฉ์ ์ธํฐํ์ด์ค(UI)
์น ํ์ด์ง์์ ๋ฒํผ, ๋งํฌ, ์ ๋ ฅ ํผ ๋ฑ ์ฌ์ฉ์๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฅํ๊ฑฐ๋ ์์ฒญ์ ๋ณด๋ผ ์ ์๋ ์์๋ค์ด ํฌํจ๋๋ค.
3) ํผ๋๋ฐฑ
View๋ ์ฌ์ฉ์๊ฐ ์ด๋ค ์์
์ ํ์ ๋ ์์คํ
์์ ๋ฐ์ํ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฌ์ฃผ๋ ํผ๋๋ฐฑ์ ์ ๊ณตํ๋ค. ์๋ฅผ ๋ค์ด, ์ฑ๊ณต ๋ฉ์์ง๋ ์ค๋ฅ ๋ฉ์์ง ๋ฑ์ ํ๋ฉด์ ํ์ํ์ฌ ์ฌ์ฉ์๊ฐ ์์คํ
์ ์ํ๋ฅผ ์ ์ ์๋๋ก ํ๋ค.
2-3. Controller (์ปจํธ๋กค๋ฌ)
Controller๋ ํด๋ผ์ด์ธํธ ์ธก์ ์์ฒญ์ ์ง์ ์ ์ผ๋ก ์ ๋ฌ๋ฐ๋ ์๋ํฌ์ธํธ(Endpoint)๋ก์จ Model๊ณผ View์ ์ค๊ฐ์์ ์ํธ์์ฉ์ ํด์ฃผ๋ ์ญํ ์ ํ๋ค.
ํด๋ผ์ด์ธํธ ์ธก์ ์์ฒญ์ ์ ๋ฌ๋ฐ์ ๋น์ฆ๋์ค ๋ก์ง์ ๊ฑฐ์น ํ, Model ๋ฐ์ดํฐ๊ฐ ๋ง๋ค์ด์ง๋ฉด, ์ด Model ๋ฐ์ดํฐ๋ฅผ View๋ก ์ ๋ฌํ๋ค.
1) ํด๋ผ์ด์ธํธ ์์ฒญ ์ฒ๋ฆฌ (Request Handling)
Controller๋ ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ์ค๋ HTTP ์์ฒญ์ **์๋ํฌ์ธํธ(Endpoint)์์ ๋ฐ์ ์ฒ๋ฆฌํ๋ค. ์๋ฅผ ๋ค์ด, ์ฌ์ฉ์๊ฐ ํน์ URL์ ํตํด ์น ํ์ด์ง๋ฅผ ์์ฒญํ๋ฉด, ํด๋น ์์ฒญ์ ์ฒ๋ฆฌํ ์ปจํธ๋กค๋ฌ ๋ฉ์๋๊ฐ ํธ์ถ๋๋ค.
@GetMapping("/user/{id}")
public String getUser(@PathVariable("id") int userId, Model model) {
// ์์ฒญ ์ฒ๋ฆฌ ๋ก์ง
}
2) Model ์์ฑ & ํ์ด์ง ์ด๋
Controller๋ ๋น์ฆ๋์ค ๋ก์ง์ ํตํด ์ฒ๋ฆฌ๋ ๋ฐ์ดํฐ๋ฅผ Model์ ๋ด๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด Model์ ๋ด๊ธด ๋ฐ์ดํฐ๊ฐ ์ต์ข
์ ์ผ๋ก View์์ ์ฌ์ฉ๋๋ค. ๋ํ ๋ค๋ฅธ ํ์ด์ง๋ก ์ด๋ํ๊ณ ๋ ๋๋งํ๋ ๊ณผ์ ์ด Controller์์ ์ฒ๋ฆฌ๋๋ค.
ํ๋ง๋๋ก model๊ณผ view๋ฅผ ์ฐ๊ฒฐํ๋ ๊ฒ์ด controller์ด๋ค. application logic์ ์ ๊ฒฝ์ฐ์ง ์๊ณ , view๋ ๋๋๋ง์ ๋ํ ์ฑ
์์ ๊ฐ๊ณ , model์ data์ฒ๋ฆฌ์๋ง ์ฑ
์์ ๊ฐ๋๋ก ์ค๊ฐ์ธ ์ญํ ์ ํ๋ค.
model์ ์์ฑํ๊ณ , view์๊ฒ model์ ์ ๋ฌํ๊ณ , view์ ์ก์
์ ์ฒ๋ฆฌํ๋ค.
๐ฅ ์ฌ๊ธฐ์ ์ ๊น ๐ฅ
ํ์๊ฐ ๊ธ์ ์์ฑํ๋ ์ค ํธ๊ธฐ์ฌ์ด ์๊ฒจ ํด๋น ๋ถ๋ถ ์ง๊ณ ๋์ด๊ฐ๊ธฐ ์ํด ์ ๋ฆฌ โผ
๐ View Resolver (๋ทฐ ๋ฆฌ์กธ๋ฒ)
๋ค๋ฅธ ํ์ด์ง๋ก ์ด๋ํ๊ณ ๋ ๋๋งํ๋ ๊ณผ์ ์ Controller์์ ์ฒ๋ฆฌ๋๋ ๊ฒ์ผ๋ก ์๊ณ ์๋ค. ๊ทธ๋ฌ๋ ์ด ๊ณผ์ ์์ ๋ชจ๋ธ(Model)๊ณผ๊ณผ ๋ทฐ(View)๊ฐ ์ด๋ป๊ฒ ์ํธ์์ฉํ๋์ง์ ๋ฐ๋ผ ๊ถ๊ธํด์ก๊ณ , MVC ํจํด ํฌ์คํ
์๋ฃ์กฐ์ฌ๋ฅผ ํ๋ ์ค '๋ทฐ ๋ฆฌ์กธ๋ฒ(View Resolver)' ๋ผ๋ ์์ํ ๊ฐ๋
์ ๋ง์ฃผ์น๊ฒ ๋์ด ํ์ด์ง ์ด๋๊ณผ ๋ ๋๋ง์ด ์ด๋ป๊ฒ ์ด๋ฃจ์ด์ง๋์ง ์ฌ๊ธฐ์ ๊ฐ๋จํ ์ ๋ฆฌํด ๋ณธ๋ค.
๊ทธ๋ฆฌ๊ณ ๋์ ์ดํ ํฌ์คํ
์ ์ด์ด๊ฐ๋๋ก ํ๊ฒ ๋ค.
๐ก ๋ทฐ ๋ฆฌ์กธ๋ฒ(View Resolver)
๋ทฐ ๋ฆฌ์กธ๋ฒ๋ Controller๊ฐ ๋ฐํํ ๋ทฐ ์ด๋ฆ์ ์ค์ ํ๋ฉด ํ์ผ๋ก ๋ณํํด์ฃผ๋ ์ญํ ์ ํ๋ค.
Controller์์ return "viewName"์ฒ๋ผ ๋ทฐ ์ด๋ฆ์ ๋ฐํํ๋ฉด, ๋ทฐ ๋ฆฌ์กธ๋ฒ๊ฐ ๊ทธ ์ด๋ฆ์ ๋ฐํ์ผ๋ก ์ค์ ๋ทฐ ํ์ผ์ ์ฐพ์ ๋ ๋๋งํ๋ค. ์๋ฅผ ๋ค์ด, viewName์ ๋ฐํํ๋ฉด ๋ทฐ ๋ฆฌ์กธ๋ฒ๊ฐ ์ด๋ฅผ viewName.jsp, viewName.html ๊ฐ์ ์ค์ ํ์ผ๋ก ๋ฐ๊ฟ์ ์ฌ์ฉ์์๊ฒ ์๋ต์ ๋ณด๋ธ๋ค.
Spring์์๋ `InternalResourceViewResolver`๋ฅผ ์ฌ์ฉํด์ JSP ํ์ผ์ ์ฒ๋ฆฌํ๋ค.
์ด View Resolver๋ ๋ทฐ ์ด๋ฆ์ .jsp ํ์ฅ์๋ฅผ ๊ฐ์ง ํ์ผ๋ก ๋ฐ๊ฟ์ ๋ ๋๋ง ํด ์ค๋ค.
@Bean
public InternalResourceViewResolver viewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
return resolver;
}
์ด ๊ฒฝ์ฐ, return "home"์ด๋ผ๊ณ ๋ฐํํ๋ฉด WEB-INF/views/home.jsp ํ์ผ์ ์ฐพ์ ๋ ๋๋งํจ.
1. ํ์ด์ง ์ด๋ (๋ฆฌ๋ค์ด๋ ์ ๋๋ ํฌ์๋ฉ)
๐ฉ๐ปโ๐ Controller์์ ๋ค๋ฅธ ํ์ด์ง๋ก ์ด๋ํ๋ ๋ฐฉ๋ฒ์๋ ๋ ๊ฐ์ง๊ฐ ์๋ค.
1.1. ํฌ์๋ฉ (Forwarding)
ํฌ์๋ฉ์ ํ์ฌ ์์ฒญ์ ๋ค๋ฅธ ๋ทฐ๋ก ์ ๋ฌํ๋ ๋ฐฉ์
Controller์์ ๋ทฐ ์ด๋ฆ์ ๋ฐํํ๋ฉด, View Resolver๊ฐ ํด๋น ๋ทฐ๋ฅผ ์ฐพ์ ๋ ๋๋งํ๋ค.
@GetMapping("/showProfile")
public String showProfile(Model model) {
model.addAttribute("user", userService.getUserDetails());
return "profile"; // profile.jsp๋ profile.html๋ก ํฌ์๋ฉ
}
์ด ๊ฒฝ์ฐ, return "profile"์ด ๋ฐํ๋๋ฉด, View Resolver๊ฐ profile.jsp๋ profile.html ํ์ผ์ ๋ ๋๋งํ์ฌ ํ์ด์ง๋ฅผ ๋ณด์ฌ์ฃผ๋ ์๋ฆฌ์ด๋ค.
1.2. ๋ฆฌ๋ค์ด๋ ์ (Redirection)
๋ฆฌ๋ค์ด๋ ์ ์ ํ์ฌ ์์ฒญ์ด ๋๋ ํ, ์๋ก์ด URL๋ก ๋ค์ ์์ฒญ์ ๋ณด๋ด๋ ๋ฐฉ์์ด๋ค. ํ์ด์ง ์ด๋ ํ URL์ด ๋ฐ๋๋ค.
@PostMapping("/submitForm")
public String submitForm(@ModelAttribute Form form) {
formService.saveForm(form);
return "redirect:/formSuccess"; // formSuccess๋ก ๋ฆฌ๋ค์ด๋ ์
}
์ ์ฝ๋์์ redirect:/formSuccess๋ ์๋ก์ด URL๋ก ๋ฆฌ๋ค์ด๋ ์
๋๋ฉฐ, ์ด๋ Controller๊ฐ ํด๋น URL์ ์ฒ๋ฆฌํ๋ ๋ฉ์๋๋ฅผ ์คํํด์ ์๋ก์ด ํ์ด์ง๋ฅผ ๋ ๋๋งํ๋ค.
โญํ์ด์ง ์ด๋ (๋ฆฌ๋ค์ด๋ ์
๋๋ ํฌ์๋ฉ)์ Controller์์ ์ฒ๋ฆฌํ๋ค.
โญ๋ ๋๋ง์ View์์ ์ฒ๋ฆฌ๋๋ฉฐ, Controller๋ ๋ ๋๋งํ ๋ทฐ๋ฅผ ์ ํํ๊ณ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ค.
โญ Controller๋ ๋ฐ์ดํฐ๋ฅผ Model์ ๋ด๋๋ค. ์ด ๋ View Resolver๊ฐ ๊ทธ ๋ฐ์ดํฐ๋ฅผ View๋ก ์ ๋ฌํ์ฌ ํ๋ฉด์ ๋ ๋๋งํ๋ค.
3. Spring MVC ํจํด ๊ตฌ์กฐ
- 1ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ์์ฒญ์ ํ๋ฉด, Front Controller์ธ DispatcherServlet ํด๋์ค๊ฐ ์์ฒญ์ ๋ฐ๋๋ค.
- DispatcherServlet์ ํ๋ก์ ํธ ํ์ผ ๋ด์ servlet-context.xml ํ์ผ์ @Controller ์ธ์๋ฅผ ํตํด ๋ฑ๋กํ ์์ฒญ ์์ ์ปจํธ๋กค๋ฌ๋ฅผ ์ฐพ์ ๋งคํ(mapping)๋ ์ปจํธ๋กค๋ฌ๊ฐ ์กด์ฌํ๋ฉด @RequestMapping์ ํตํด ์์ฒญ์ ์ฒ๋ฆฌํ ๋ฉ์๋๋ก ์ด๋ํ๋ค.
- ์ปจํธ๋กค๋ฌ๋ ํด๋น ์์ฒญ์ ์ฒ๋ฆฌํ Service(์๋น์ค)๋ฅผ ๋ฐ์ ๋น์ฆ๋์ค ๋ก์ง์ ์๋น์ค์๊ฒ ์์ํ๋ค.
- Service๋ ์์ฒญ์ ํ์ํ ์์ ์ ์ํํ๊ณ , ์์ฒญ์ ๋ํด DB์ ์ ๊ทผํด์ผ ํ๋ค๋ฉด DAO์ ์์ฒญํ์ฌ ์ฒ๋ฆฌ๋ฅผ ์์ํ๋ค.
- DAO๋ DB ์ ๋ณด๋ฅผ DTO๋ฅผ ํตํด ๋ฐ์ ์๋น์ค์๊ฒ ์ ๋ฌํ๋ค.
- ์๋น์ค๋ ์ ๋ฌ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ปจํธ๋กค๋ฌ์๊ฒ ์ ๋ฌํ๋ค.
- ์ปจํธ๋กค๋ฌ๋ Model(๋ชจ๋ธ) ๊ฐ์ฒด์๊ฒ ์์ฒญ์ ๋ง๋ View ์ ๋ณด๋ฅผ ๋ด์ DispatcherServlet์๊ฒ ์ ์กํ๋ค.
- DispatcherServlet์ ViewResolver์๊ฒ ์ ๋ฌ๋ฐ์ View ์ ๋ณด๋ฅผ ์ ๋ฌํ๋ค.
- ViewResolver๋ ์๋ตํ View์ ๋ํ JSP๋ฅผ ์ฐพ์ DispatcherServlet์๊ฒ ์ ๋ฌํ๋ค.
- DispatcherServlet์ ์๋ตํ ๋ทฐ์ Render๋ฅผ ์ง์ํ๊ณ ๋ทฐ๋ ๋ก์ง์ ์ฒ๋ฆฌํ๋ค.
- DispatcherServlet์ ํด๋ผ์ด์ธํธ์๊ฒ Rending๋ ๋ทฐ๋ฅผ ์๋ตํ๋ฉฐ ์์ฒญ์ ๋ง์น๋ค.
๐ฉ๐ปโ๐ DispatcherServlet
DispatcherServlet์ Spring MVC์์ Front Controller ์ญํ ์ ํ๋ฉฐ, ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ค์์์ ์ฒ๋ฆฌํ๋ ์ปดํฌ๋ํธ์ด๋ค. ๋ชจ๋ HTTP ์์ฒญ์ ๋จผ์ DispatcherServlet์ ์ ๋ฌ๋์ด, ์ ์ ํ Controller๋ก ์์ฒญ์ ์์ํ ํ, ๊ทธ ๊ฒฐ๊ณผ๋ฅผ View์ ์ ๋ฌํ๋ค. DispatcherServlet์ HttpServlet์ ์์๋ฐ์ ์ฌ์ฉํ๊ณ , ์๋ธ๋ฆฟ์ผ๋ก ๋์ํ๋ค.
DispatcherServlet โ FrameworkServlet โ HttpServletBean โ HttpServlet
DispacherServlet์ ์ฌ์ฉํ๋ฉด ์๋ธ๋ฆฟ์ผ๋ก ๋ฑ๋กํ๋ฉด์ ๋ชจ๋ ๊ฒฝ๋ก์ (urlPatterns=โ/โ)์ ๋ํด ๋งคํํ๋ค.
๐ก DispatcherServlet์ Front Controller๋ก ์ค์ ํ๋ ๋ฐฉ๋ฒ 3๊ฐ์ง
- web.xml: web.xml์์ DispatcherServlet์ ์ค์ ํ๊ณ , URL ๋งคํ
- Java Configuration: WebApplicationInitializer๋ฅผ ๊ตฌํํ์ฌ Java ์ฝ๋๋ก ์ค์
- Spring Boot: Spring Boot์์๋ ์๋์ผ๋ก DispatcherServlet์ด ์ค์ ๋จ.
๐ฉ๐ปโ๐ HandlerMapping
HandlerMapping ์ ํด๋ผ์ด์ธํธ์ ์์ฒญ URL ์ ์ด๋ค ์ปจํธ๋กค๋ฌ๊ฐ ์ฒ๋ฆฌํ ์ง ๊ฒฐ์ ํ๋ ๊ธฐ๋ฅ์ ํ๋ค.
๐ฉ๐ปโ๐ Controller
DispatcherServlet์ ํด๋ผ์ด์ธํธ์ HTTP ์์ฒญ์ Controller๋ก ์ ๋ฌํ๊ณ , Controller๋ ์์ฒญ์ ์ฒ๋ฆฌํ ํ ๊ฒฐ๊ณผ๋ฅผ Model์ ์ ์ฅํ๋ ๋ฐฉ์์ผ๋ก ๋ฐํํ๋ค. ๋ฐํ๋ ๊ฒฐ๊ณผ(Model)๋ HandlerAdapter์ ์ํด ModelAndView ๊ฐ์ฒด๋ก ๋ณํ๋๋ค. ์ด ๊ฐ์ฒด์๋ View Name๊ณผ ํจ๊ป, ์๋ต์ ํฌํจ๋ ๋ฐ์ดํฐ๊ฐ ํฌํจ๋์ด ์์ด ์ต์ข
์ ์ผ๋ก View์ ์ ๋ฌ๋๋ค.
๐ฉ๐ปโ๐ ModelAndView
Controller์ ์ํด ๋ฐํ๋ Model๊ณผ View๊ฐ Wrapping๋ ๊ฐ์ฒด์ด๋ค.
๐ฉ๐ปโ๐ ViewResolver
ModelAndView ๋ฅผ ์ ๋ฌ๋ฐ์ DispatcherServlet ์ ์ค์ ํด๋ผ์ด์ธํธ์๊ฒ ๋ณด์ฌ์ง View ๋ฅผ ๋ ๋๋งํ๊ธฐ ์ํด ์ด๋ค View ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ์ง ๊ฒฐ์ ํด์ผ ํ๋ค. ์ด ๋ ํธ์ถํ๋ ๊ฒ์ด ViewResolver ์ด๋ค.
๐ฉ๐ปโ๐ View
ViewResolver ์ ์ํด View ๊ฐ์ฒด๊ฐ ๊ฒฐ์ ๋๊ณ ํด๋น ๊ฐ์ฒด๋ฅผ ํตํด View ๋ฅผ ๋ ๋๋งํ๋ค.
4. Spring MVC ์ ๋ฐ์ ๋ฐฐ๊ฒฝ
MVC 1 ํจํด โ MCV 2 ํจํด โ Spring MVC
4-1. MVC 1 ํจํด
MVC 1 ํจํด์ ์ด๊ธฐ ์น ์ ํ๋ฆฌ์ผ์ด์
์์ ์ฌ์ฉ๋์๋ ๋ฐฉ์์ผ๋ก, ๋ธ๋ผ์ฐ์ (์ฌ์ฉ์)๋ก๋ถํฐ ์์ฒญ์ด ๋ค์ด์ค๋ฉด DB๋ก๋ถํฐ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ Model ๊ฐ์ฒด(Java Bean)๋ฅผ JSP ํ์ด์ง(View)์ ๋ด์ ์๋ต์ผ๋ก ๋ณด๋ด๋ ํจํด์ด๋ค. Model๊ณผ View๊ฐ ๊ฒฐํฉ๋์ด ์์ด, JSP๋ Servlet์ด Model๊ณผ View ์ญํ ์ ๋์์ ์ฒ๋ฆฌํ์ต๋๋ค. ์ด๋ก ์ธํด ๋น์ฆ๋์ค ๋ก์ง๊ณผ ํ๋ฉด ํ์ ์ฝ๋๊ฐ ํผํฉ๋์ด ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ๊ณผ ์ ์ง๋ณด์๊ฐ ์ด๋ ค์ ๋ค.
๐๐ป ์ด๋ฌํ ์ ์ ๋ณด์ํ์ฌ Controller ์ญํ ์ ํ๋ Servlet์ด ์ถ๊ฐ๋ MVC2 ํจํด์ด ๋ฑ์ฅํ๊ฒ ๋์๋ค.
4-2. MVC 2 ํจํด
MVC 2 ํจํด์์๋ ์์ฒญ์ ํ๋์ ์ปจํธ๋กค๋ฌ(Servlet)๊ฐ ๋จผ์ ๋ฐ๋๋ค. ์๋ธ๋ฆฟ์ ์์ฒญ์ ๋ํ ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ ํ, ์ด๋ฅผ JSP ํ์ผ์ ๋ฐ์ํ๋ ์ญํ ์ ์ํํ๊ธฐ ์ํด ๊ณ ์๋์๋ค. MVC 2์์๋ Model๊ณผ View๋ฅผ ๋ถ๋ฆฌํด์ Controller๊ฐ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ , Model๊ณผ View ์ฌ์ด๋ฅผ ์ฐ๊ฒฐํ๋๋ก ํ๋ค. ์ด ๋ฐฉ์์ ์ฝ๋ ๋ถ๋ฆฌ์ ์ ์ง๋ณด์์ฑ์ ๊ฐ์ ํ์๊ณ , ํ์ฌ ๋๋ถ๋ถ์ ์น ์ ํ๋ฆฌ์ผ์ด์
์์ ์ฌ์ฉ๋๊ณ ์๋ค.
4-3. Sprign MVC
Spring MVC๋ MVC 2 ํจํด์ ๋ฐ์ ์ํจ ์น ๋ชจ๋๋ก, ์คํ๋ง ํ๋ ์์ํฌ์์ ์ฌ์ฉ๋๋ค. ์ด ๊ตฌ์กฐ์์๋ ํ๋ก ํธ ์ปจํธ๋กค๋ฌ(DispatcherServlet)๊ฐ ๋ชจ๋ ์์ฒญ์ ์ฒ์์ผ๋ก ๋ฐ๋๋ค. ์ดํ, ํ๋ก ํธ ์ปจํธ๋กค๋ฌ๋ ์์ฒญ์ ์ ์ ํ ๊ฐ๋ณ ์ปจํธ๋กค๋ฌ(ํธ๋ค๋ฌ)๋ก ๋๊ธด๋ค.
์ด ๊ฐ๋ณ ์ปจํธ๋กค๋ฌ๋ DI(์์กด์ฑ ์ฃผ์
)๋ฅผ ํตํด ์์ฑ๋ Bean์ ์ฌ์ฉํด ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ๊ณ , ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ Model์ ๋ด๊ฒจ ๋ค์ ํ๋ก ํธ ์ปจํธ๋กค๋ฌ๋ก ์ ๋ฌ๋๋ค. ํ๋ก ํธ ์ปจํธ๋กค๋ฌ๋ ์ด Model์ ์ ์ ํ View ํ
ํ๋ฆฟ์ ์ ๋ฌํ์ฌ, ์ต์ข
์ ์ผ๋ก ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ค ํ๋ฉด์ ์์ฑํ๊ณ ์๋ตํ๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก, Spring MVC๋ ํด๋ฆฐํ ๊ตฌ์กฐ๋ก ์์ฒญ์ ์ฒ๋ฆฌํ๋ฉฐ, ๊ฐ ์ญํ ์ ๋ช
ํํ ๋ถ๋ฆฌํ์ฌ ์ ์ง๋ณด์์ ํ์ฅ์ฑ์ด ์ฉ์ดํ๋ค!
์ฐธ๊ณ ์๋ฃ
1. ํฌ์คํ ์์ฑ์ ๋์์ ์ฃผ์ ๊ฐ์ฌํ ๋ธ๋ก๊ทธ (๊พธ๋ฒ )
FrontController ์ถ๊ฐํ๋ ๋ฒ โผ
'Coding > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java] ์๋ฐ Runtime addShutdownHook() ์ ๋ํด ์์๋ณด์ (14) | 2025.02.04 |
---|---|
[Java] ์๋ฐ ๋ฐฐ์ด ์ ๋ ฌ ํ ๋ ์ค๋ฒํ๋ก์ฐ ๋ฐฉ์งํ๋ ๋ฒ (11) | 2025.02.01 |
[JSP & Servlet] URL ๋งคํ (9) | 2025.01.28 |
[Java] ์ฟผ๋ฆฌ์คํธ๋ง ์ผ๋ก ๊ฐ ๋๊ฒจ์ ํ๋ฉด์ ์ถ๋ ฅํ๊ธฐ (15) | 2025.01.26 |
[JSP & Servlet] ์ฟ ํค(Cookie)์ Session(์ธ์ ), ์ฟผ๋ฆฌ์คํธ๋ง(QueryString) ์ ๋ํด ์์๋ณด์ (13) | 2025.01.26 |