1. ์คํ๋ง MVC๋?
์คํ๋ง mvc๋ ์คํ๋ง ํ๋ ์์ํฌ์ ์ผ๋ถ๋ก, ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ๊ธฐ ์ํ ๊ฐ๋ ฅํ ์น ํ๋ ์์ํฌ์ด๋ค.
MVC ์ํคํ ์ณ๋ฅผ ๋ฐ๋ฅด๋ฉฐ, ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น์ฆ๋์ค ๋ก์ง๊ณผ ํ๋ ์ ํ ์ด์ ๊ณ์ธต์ ๋ถ๋ฆฌํ์ฌ ๊ฐ๋ฐ์ ์ ์ฐ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ๋์ธ๋ค.
MVC ์ํคํ ์ฒ๋?
MVC ์ํคํ ์ฒ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ธ ๊ฐ์ง ์ฃผ์ ์ปดํฌ๋ํธ๋ก ๋ถ๋ฆฌํ๋ ๋์์ธ ํจํด์ด๋ค.
- Model : ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์ดํฐ์ ๋น์ฆ๋์ค ๋ก์ง์ ๋ด๋น
- View : ์ฌ์ฉ์์๊ฒ ๋ฐ์ดํฐ๋ฅผ ์์์ ์ผ๋ก ํ์ํ๋ ๋ถ๋ถ
- Controller : ์ฌ์ฉ์ ์ ๋ ฅ์ ์ฒ๋ฆฌํ๊ณ , ๋ชจ๋ธ๊ณผ ๋ทฐ ์ฌ์ด์ ์ธํฐ๋์ ์ ๊ด๋ฆฌ
2. ์คํ๋ง MVC์ ์ฃผ์ ๊ตฌ์ฑ ์์
DispatcherServlet
DispatcherServlet์ ์คํ๋ง MVC์ ํ๋ก ํธ ์ปจํธ๋กค๋ฌ ์ญํ ์ ํ๋ฉฐ, ๋ชจ๋ HTTP ์์ฒญ์ ๋ฐ์์ ์ ์ ํ ํธ๋ค๋ฌ๋ก ๋ผ์ฐํ ํ๋ค.
Controller
Controller๋ ์ฌ์ฉ์ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ , ํ์ํ ๋ฐ์ดํฐ๋ฅผ Model์ ์ถ๊ฐํ ํ, View ์ด๋ฆ์ ๋ฐํํ๋ค. ์ฃผ๋ก @Controller ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ์ฌ ์ ์ํ๋ค.
ViewResolver
ViewResolver๋ ์ปจํธ๋กค๋ฌ๊ฐ ๋ฐํํ View ์ด๋ฆ์ ์ค์ View ๊ฐ์ฒด๋ก ๋ณํํ๋ ์ญํ ์ ํ๋ค. JSP, thymeleaf, Freemarker ๋ฑ์ ํ ํ๋ฆฟ ์์ง๊ณผ ์ฐ๋ํ ์ ์๋ค.
3. ์คํ๋ง MVC ์ค์
์คํ๋ง MVCํ๋ก์ ํธ๋ฅผ ์ค์ ํ๋ ๋ฐฉ๋ฒ์๋ ์ผ๋ฐ์ ์ผ๋ก Maven๋๋ Gradle์ ์ฌ์ฉํ๋ค.
Maven
xmlํ์ผ์ ์์กด์ฑ์ ์ถ๊ฐํ๋ค.
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.10</version>
</dependency>
Gradle
gradleํ์ผ์ ์์กด์ฑ์ ์ถ๊ฐ
dependencies {
implementation 'org.springframework:spring-webmvc:5.3.10'
}
์คํ๋ง ์ค์ ํ์ผ (XML/ Java Config)
์คํ๋ง MVC๋ฅผ ์ค์ ํ๊ธฐ ์ํ ๋ฐฉ๋ฒ
XML
xml์ค์ ์ web.xml๊ณผ ์คํ๋ง ์ค์ ํ์ผ์ ์ฌ์ฉํ์ฌ ๊ตฌ์ฑํ ์ ์๋ค. ๋จผ์ web.xmlํ์ผ์์ dispactcherServlet์ ์ค์ ํ๋ ๋ฐฉ๋ฒ์ด๋ค.
<web-app>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/dispatcher-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
dispatcher-servlet.xml ํ์ผ์์ ๋ทฐ ๋ฆฌ์กธ๋ฒ์ ๊ธฐ๋ณธ์ ์ธ ๋น์ ์ค์ ํ๋ ๋ฐฉ๋ฒ์ด๋ค.
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
<context:component-scan base-package="com.example"/>
<mvc:annotation-driven/>
</beans>
Java Config
@Configuration ์ด๋ ธํ ์ด์ ์ด ๋ถ์ ํด๋์ค์ @EnableWebMvc ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ์ฌ ๊ตฌ์ฑํ ์ ์๋ค.
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.example")
public class WebConfig implements WebMvcConfigurer {
@Bean
public InternalResourceViewResolver viewResolver() {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setPrefix("/WEB-INF/views/");
viewResolver.setSuffix(".jsp");
return viewResolver;
}
}
๊ทธ๋ฆฌ๊ณ ์คํ๋ง ๋ถํธ์ฒ๋ผ servletInitalizer ํด๋์ค๋ฅผ ๋ง๋ค์ด ์ด๊ธฐ ์ค์ ์ ํ ์ ์๋ค.
public class ServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[] { RootConfig.class };
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[] { WebConfig.class };
}
@Override
protected String[] getServletMappings() {
return new String[] { "/" };
}
}
์ด ์ค์ ์ ์คํ๋ง ๋ถํธ๋ฅผ ์ฌ์ฉํ์ง ์๋ ํ๊ฒฝ์์ ์คํ๋งMVC๋ฅผ ์ค์ ํ ๋ ์ ์ฉํ๋ค.
4. ์คํ๋ง MVC์ ์๋ ์๋ฆฌ
์์ฒญ ์ฒ๋ฆฌ ๊ณผ์
1. ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญ ๋ณด๋
2. DispatcherServlet์ด ์์ฒญ์ ๋ฐ์
3. DispatcherServlet์ HandlerMapping์ ์ฌ์ฉํ์ฌ ์์ฒญ์ ์ ์ ํ ์ปจํธ๋กค๋ฌ์ ๋งคํ
4. ์ปจํธ๋กค๋ฌ๋ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ , ๋ชจ๋ธ ๋ฐ์ดํฐ๋ฅผ ์์ฑ
5. ์ปจํธ๋กค๋ฌ๋ ViewResolver๋ฅผ ํตํด ์ ์ ํ ๋ทฐ๋ฅผ ์ ํ
6. View๋ ์ต์ข ๊ฒฐ๊ณผ๋ฅผ ํด๋ผ์ด์ธํธ์๊ฒ ์๋ต์ผ๋ก ๋ณด๋
DispatcherServlet์ ์ญํ
DispatcherServlet์ ๋ชจ๋ ์์ฒญ์ ์ค์์์ ์ฒ๋ฆฌํ๊ณ , ์ ์ ํ ํธ๋ค๋ฌ๋ก ๋ผ์ฐํ ํ๋ค.
5. Controller
@Controller, @RestController
@Controller๋ ์น ์์ฒญ์ ์ฒ๋ฆฌํ๋ ํด๋์ค์ ์ฌ์ฉ๋๊ณ , @RestController๋ Restful ์น ์๋น์ค๋ฅผ ์ฝ๊ฒ ๋ง๋ค ์ ์๋๋ก ๋์์ค๋ค.
๋ ์ด๋ ธํ ์ด์ ์ ์ฐจ์ด์ ์ @RestController๋ @Controllerdhk @ResponseBody๋ฅผ ๊ฒฐํฉํ ๊ฒ์ผ๋ก RESTful๋ฅผ ๊ตฌ์ถํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
@Controller
public class MyController {
@GetMapping("/welcome")
public String welcome(Model model) {
model.addAttribute("message", "Welcome to Spring MVC!");
return "welcome";
}
}
@RestController
public class MyRestController {
@GetMapping("/api/welcome")
public String welcome() {
return "Welcome to Spring MVC!";
}
}
์์ฒญ ๋งคํ(@RequestMapping, @GetMapping, @PostMapping ๋ฑ)
์คํ๋ง MVC์์๋ ์์ฒญ์ ๋งคํํ๊ธฐ ์ํด ๋ค์ํ ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ๋ค. ์๋ฅผ ๋ค๋ฉด @GetMapping์ Get์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋ฉ์๋์ ์ฌ์ฉ๋๋ค.
@Controller
public class MyController {
@GetMapping("/welcome")
public String welcome(Model model) {
model.addAttribute("message", "Welcome to Spring MVC!");
return "welcome";
}
@PostMapping("/submit")
public String submit(@RequestParam("name") String name, Model model) {
model.addAttribute("message", "Hello, " + name + "!");
return "welcome";
}
}
6. ๋ทฐ(View) ๊ตฌ์ฑ
JSP, Thymeleaf, Freemarker ๋ฑ ์คํ๋ง MVC๋ ๋ค์ํ ๋ทฐ ํ ํ๋ฆฟ ์์ง์ ์ง์ํ๋ค. JSP, Thymeleaf, Freemarker ๋ฑ์ด ๋ํ์ ์ด๋ค.
JSP ์ค์ ๋ฐ ์ฌ์ฉ
JSP ์ค์
JSP(JavaServer Pages)๋ ์๋ฐ ๊ธฐ๋ฐ์ ํ ํ๋ฆฟ ์์ง์ผ๋ก, ์คํ๋ง MVC์์ ์์ฃผ ์ฌ์ฉ๋๋ค. JSP๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ค์ ํ๋ค.
1. WebConfig ์ค์ (javaConfig):
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.example")
public class WebConfig implements WebMvcConfigurer {
@Bean
public InternalResourceViewResolver viewResolver() {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setPrefix("/WEB-INF/views/");
viewResolver.setSuffix(".jsp");
return viewResolver;
}
}
2. Web.xml ์ค์ (XML Config)
<web-app>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/dispatcher-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
3. dispatcher-servlet.xml ์ค์ (XML Config) :
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
<context:component-scan base-package="com.example"/>
<mvc:annotation-driven/>
</beans>
JSP ์ฌ์ฉ ์์
1. ์ปจํธ๋กค๋ฌ ์์ฑ
@Controller
public class MyController {
@GetMapping("/welcome")
public String welcome(Model model) {
model.addAttribute("message", "Welcome to Spring MVC with JSP!");
return "welcome";
}
}
2. JSP ํ์ผ ์์ฑ ( welcome.jsp)
<!DOCTYPE html>
<html>
<head>
<title>Welcome</title>
</head>
<body>
<h1>${message}</h1>
</body>
</html>
Thymeleaf ์ค์ ๋ฐ ์ฌ์ฉ
์์กด์ฑ ์ถ๊ฐ :
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
2. WebConfig ์ค์ :
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.example")
public class WebConfig implements WebMvcConfigurer {
@Bean
public SpringResourceTemplateResolver templateResolver() {
SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();
templateResolver.setPrefix("/WEB-INF/views/");
templateResolver.setSuffix(".html");
templateResolver.setTemplateMode(TemplateMode.HTML);
return templateResolver;
}
@Bean
public SpringTemplateEngine templateEngine() {
SpringTemplateEngine templateEngine = new SpringTemplateEngine();
templateEngine.setTemplateResolver(templateResolver());
templateEngine.setEnableSpringELCompiler(true);
return templateEngine;
}
@Bean
public ThymeleafViewResolver viewResolver() {
ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
viewResolver.setTemplateEngine(templateEngine());
return viewResolver;
}
}
Thymleaf ์ฌ์ฉ ์์
1. ์ปจํธ๋กค๋ฌ ์์ฑ
@Controller
public class MyController {
@GetMapping("/welcome")
public String welcome(Model model) {
model.addAttribute("message", "Welcome to Spring MVC with Thymeleaf!");
return "welcome";
}
}
2. Thymeleaf ํ ํ๋ฆฟ ํ์ผ ์์ฑ
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Welcome</title>
</head>
<body>
<h1 th:text="${message}">Welcome</h1>
</body>
</html>
7. ํผ ์ฒ๋ฆฌ ๋ฐ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ
ํผ ๋ฐ์ดํฐ ์ฒ๋ฆฌ
ํผ ๋ฐ์ดํฐ ์ฒ๋ฆฌํ๋ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ์ @Controller๋ฅผ ์ฌ์ฉํ ํด๋์ค์์ ํผ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ณ , ์ด๋ฅผ ์ฒ๋ฆฌํ๋ค.
์์ : ์ฌ์ฉ์ ๋ฑ๋ก ํผ ์ฒ๋ฆฌ
1. ํผ ๋ฐ์ดํฐ๋ฅผ ๋ด์ ๋ชจ๋ธ ํด๋์ค ์์ฑ
package com.example.model;
public class User {
private String name;
private String email;
// Getters and setters
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
2. ์ปจํธ๋กค๋ฌ ์์ฑ
package com.example.controller;
import com.example.model.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
@Controller
public class UserController {
@GetMapping("/register")
public String showForm(Model model) {
model.addAttribute("user", new User());
return "register";
}
@PostMapping("/register")
public String submitForm(@ModelAttribute User user, Model model) {
model.addAttribute("message", "User registered successfully!");
model.addAttribute("user", user);
return "result";
}
}
3. JSP ํ์ผ ์์ฑ
- register.jsp
<!DOCTYPE html>
<html>
<head>
<title>Register</title>
</head>
<body>
<h2>Register</h2>
<form action="register" method="post">
Name: <input type="text" name="name"/><br/>
Email: <input type="email" name="email"/><br/>
<input type="submit" value="Submit"/>
</form>
</body>
</html>
- result.jsp
<!DOCTYPE html>
<html>
<head>
<title>Result</title>
</head>
<body>
<h2>${message}</h2>
<p>Name: ${user.name}</p>
<p>Email: ${user.email}</p>
</body>
</html>
@ModelAttribute์ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ
์์ : @ModelAttribute ์ฌ์ฉ
1. ์ปจํธ๋กค๋ฌ ์์
@Controller
public class UserController {
@GetMapping("/register")
public String showForm(Model model) {
model.addAttribute("user", new User());
return "register";
}
@PostMapping("/register")
public String submitForm(@ModelAttribute("user") User user, Model model) {
model.addAttribute("message", "User registered successfully!");
return "result";
}
}
@Valid์ ์ ํจ์ฑ ๊ฒ์ฌ
์์ : ์ ํจ์ฑ ๊ฒ์ฌ ์ถ๊ฐ
1. User ํด๋์ค์ ์ ํจ์ฑ ๊ฒ์ฆ ์ด๋ ธํ ์ด์ ์ถ๊ฐ
package com.example.model;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotEmpty;
public class User {
@NotEmpty(message = "Name is required")
private String name;
@Email(message = "Email should be valid")
@NotEmpty(message = "Email is required")
private String email;
// Getters and setters
// ...
}
2. ์ปจํธ๋กค๋ฌ ์์
@Controller
public class UserController {
@GetMapping("/register")
public String showForm(Model model) {
model.addAttribute("user", new User());
return "register";
}
@PostMapping("/register")
public String submitForm(@Valid @ModelAttribute("user") User user, BindingResult result, Model model) {
if (result.hasErrors()) {
return "register";
}
model.addAttribute("message", "User registered successfully!");
return "result";
}
}
3. JSP ํ์ผ ์์
<!DOCTYPE html>
<html>
<head>
<title>Register</title>
</head>
<body>
<h2>Register</h2>
<form action="register" method="post">
Name: <input type="text" name="name"/><br/>
<c:if test="${not empty user.name.errors}">
<span style="color: red;">${user.name.errors}</span><br/>
</c:if>
Email: <input type="email" name="email"/><br/>
<c:if test="${not empty user.email.errors}">
<span style="color: red;">${user.email.errors}</span><br/>
</c:if>
<input type="submit" value="Submit"/>
</form>
</body>
</html>
8. ์์ธ ์ฒ๋ฆฌ
์์ธ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ
์คํ๋ง MVC์์ ์์ธ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ์ @ExceptionHandler ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.
1. ์ปจํธ๋กค๋ฌ์์ ์์ธ ์ฒ๋ฆฌ๊ธฐ ์์ฑ
@Controller
public class MyController {
@GetMapping("/causeError")
public String causeError() {
throw new RuntimeException("Intentional Error");
}
@ExceptionHandler(RuntimeException.class)
public String handleRuntimeException(RuntimeException ex, Model model) {
model.addAttribute("message", ex.getMessage());
return "error";
}
}
2. ์๋ฌ ๋ทฐ ์์ฑ
- error.jsp
<!DOCTYPE html>
<html>
<head>
<title>Error</title>
</head>
<body>
<h2>Error occurred</h2>
<p>${message}</p>
</body>
</html>
@ControllerAdvice๋ฅผ ์ฌ์ฉํ ๊ธ๋ก๋ฒ ์์ธ ์ฒ๋ฆฌ
๋ชจ๋ ์ปจํธ๋กค๋ฌ์์ ๋ฐ์ํ๋ ์์ธ๋ฅผ ์ ์ญ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ค.
1. GlobalExceptionHandler ํด๋์ค ์์ฑ
package com.example.exception;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public String handleException(Exception ex, Model model) {
model.addAttribute("message", ex.getMessage());
return "error";
}
}
2. ์ปจํธ๋กค๋ฌ์์ ์์ธ ๋ฐ์
@Controller
public class MyController {
@GetMapping("/causeError")
public String causeError() {
throw new RuntimeException("Intentional Error");
}
}
์ ์ค์ ์ ํตํด ๋ชจ๋ ์ปจํธ๋กค๋ฌ์์ ๋ฐ์ํ๋ ์์ธ๋ฅผ GlobalExceptionHandler์์ ์ฒ๋ฆฌํ ์ ์๋ค.
์ฌ์ฉ์ ์ ์ ์์ธ ์ฒ๋ฆฌ
1. ์ฌ์ฉ์ ์ ์ ์์ธ ํด๋์ค ์์ฑ
package com.example.exception;
public class CustomException extends RuntimeException {
public CustomException(String message) {
super(message);
}
}
2. ์ปจํธ๋กค๋ฌ์์ ์ฌ์ฉ์ ์ ์ ์์ธ ๋ฐ์
@Controller
public class MyController {
@GetMapping("/causeCustomError")
public String causeCustomError() {
throw new CustomException("Custom Error Occurred");
}
}
3. GlobalExceptionHandler์์ ์ฌ์ฉ์ ์ ์ ์์ธ ์ฒ๋ฆฌ
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(CustomException.class)
public String handleCustomException(CustomException ex, Model model) {
model.addAttribute("message", ex.getMessage());
return "error";
}
}
์คํ๋ง MVC: ํต์ฌ ๊ฐ๋ ์์ฝ
1. MVC ํจํด
- Model: ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์ดํฐ์ ๋น์ฆ๋์ค ๋ก์ง์ ๋ด๋นํฉ๋๋ค.
- View: ์ฌ์ฉ์์๊ฒ ๋ฐ์ดํฐ๋ฅผ ํ์ํ๋ ์ญํ ์ ํฉ๋๋ค.
- Controller: ์ฌ์ฉ์์ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ์ ์ ํ ๋ชจ๋ธ๊ณผ ๋ทฐ๋ฅผ ๊ฒฐํฉํฉ๋๋ค.
2. ์ฃผ์ ๊ตฌ์ฑ ์์
- DispatcherServlet: ๋ชจ๋ ์์ฒญ์ ๋ฐ์์ ์ฒ๋ฆฌํ๊ณ ์ ์ ํ ์ปจํธ๋กค๋ฌ์ ์ ๋ฌํฉ๋๋ค.
- Controller: ์ฌ์ฉ์ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ๋ชจ๋ธ ๋ฐ์ดํฐ๋ฅผ ์ค๋นํ์ฌ ๋ทฐ ์ด๋ฆ์ ๋ฐํํฉ๋๋ค.
- Model: ์ปจํธ๋กค๋ฌ๊ฐ ๋ทฐ์ ์ ๋ฌํ ๋ฐ์ดํฐ๋ฅผ ๋ด๊ณ ์์ต๋๋ค.
- ViewResolver: ๋ทฐ ์ด๋ฆ์ ์ค์ ๋ทฐ๋ก ๋ณํํฉ๋๋ค.
- HandlerMapping: ์์ฒญ URL์ ์ ์ ํ ์ปจํธ๋กค๋ฌ์ ๋งคํํฉ๋๋ค.
3. ์์ฒญ ํ๋ฆ
- ํด๋ผ์ด์ธํธ ์์ฒญ: ์ฌ์ฉ์๊ฐ ์น ๋ธ๋ผ์ฐ์ ์์ ํน์ URL๋ก ์์ฒญ์ ๋ณด๋ ๋๋ค.
- DispatcherServlet: ๋ชจ๋ ์์ฒญ์ ๋ฐ์์ ์ฒ๋ฆฌํ ์ค๋น๋ฅผ ํฉ๋๋ค.
- HandlerMapping: ์์ฒญ URL์ ๋ถ์ํ์ฌ ํด๋น URL์ ์ฒ๋ฆฌํ ์ปจํธ๋กค๋ฌ๋ฅผ ์ฐพ์ต๋๋ค.
- Controller: ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ๋ชจ๋ธ ๋ฐ์ดํฐ๋ฅผ ์ค๋นํ์ฌ ๋ทฐ ์ด๋ฆ์ ๋ฐํํฉ๋๋ค.
- ViewResolver: ๋ทฐ ์ด๋ฆ์ ์ค์ ๋ทฐ ํ ํ๋ฆฟ์ผ๋ก ๋ณํํฉ๋๋ค.
- View: ๋ชจ๋ธ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ค ์ต์ข HTML์ ์์ฑํฉ๋๋ค.
- ์๋ต ๋ฐํ: ์์ฑ๋ HTML์ด ํด๋ผ์ด์ธํธ์๊ฒ ์๋ต์ผ๋ก ์ ์ก๋ฉ๋๋ค.
4. ์ฃผ์ ์ ๋ํ ์ด์
- @Controller: ํด๋์ค๊ฐ ์ปจํธ๋กค๋ฌ์์ ๋ํ๋ ๋๋ค.
- @RestController: RESTful ์น ์๋น์ค๋ฅผ ์ํ ์ปจํธ๋กค๋ฌ์์ ๋ํ๋ ๋๋ค.
- @RequestMapping: ์์ฒญ URL์ ์ปจํธ๋กค๋ฌ ๋ฉ์๋์ ๋งคํํฉ๋๋ค.
- @GetMapping, @PostMapping: HTTP ๋ฉ์๋์ URL์ ๋งคํํฉ๋๋ค.
- @RequestParam: ์์ฒญ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฉ์๋ ํ๋ผ๋ฏธํฐ์ ๋งคํํฉ๋๋ค.
- @PathVariable: URL ๊ฒฝ๋ก ๋ณ์ ๊ฐ์ ๋ฉ์๋ ํ๋ผ๋ฏธํฐ์ ๋งคํํฉ๋๋ค.
- @RequestBody: ์์ฒญ ๋ณธ๋ฌธ์ ๊ฐ์ฒด๋ก ๋ณํํ์ฌ ์ปจํธ๋กค๋ฌ ๋ฉ์๋์ ์ ๋ฌํฉ๋๋ค.
5. ๋ทฐ ํ ํ๋ฆฟ ์์ง
- Thymeleaf: ์คํ๋ง ๋ถํธ์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉ๋๋ ํ ํ๋ฆฟ ์์ง์ ๋๋ค.
- JSP: ์๋ฐ ๊ธฐ๋ฐ์ ๋ทฐ ํ ํ๋ฆฟ ์์ง์ ๋๋ค.
'๐์คํฐ๋ > ์คํ๋ง' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์คํ๋ง AOP (0) | 2024.05.19 |
---|---|
[์คํ๋ง] - ์คํ๋ง ์ปดํฌ๋ํธ ์ค์บ (0) | 2024.04.15 |
[์คํ๋ง] - ์คํ๋ง ์ปจํ ์ด๋(Spring Container) (0) | 2024.04.08 |