- 스프링 MVC도 프론트 컨트롤러 패턴으로 구현되어 있다.
- 스프링 MVC의 프론트 컨트롤러가 바로 디스패처 서블릿이다.
- 그리고 이 디스패처 서블릿이 바로 스프링 MVC의 핵심이다.
- DispatcherServlet도 부모 클래스에서 httpServlet을 상속 받아서 사용하고, 서블릿으로 동작한다.
DispatcherServlet -> FrameworkServlet -> HttpServletBean -> HttpServlet
- 핸들러 조회 : 핸들러 매핑을 통해 요청 URL에 매핑된 핸들러(컨트롤러)를 조회한다.
- 핸들러 어댑터 조회 : 핸들러를 실행할 수 있는 핸들러 어댑터를 조회한다.
- 핸들러 어댑터 실행 : 핸들러 어댑터를 실행한다.
- viewResolver 호출 : 뷰 리졸버를 찾고 실행한다.
- view 반환 : 뷰 리졸버는 뷰의 논리이름을 물리이름으로 바꾸고, 렌더링 역할을 담당하는 뷰 객체를 반환한다. (forward, redirect / 기본방식 : forward)
- Controller에서 데이터를 Model에 담는다. view는 Model에 담겨있는 데이터만 쏙쏙 골라서 화면에 바이딩 해준다.
- Model 객체는 컨트롤러에서 데이터를 생성해 이를 JSP, HTML 즉, view단에 전달하는 역할을 한다.
- HashMap 형태를 갖고 있고, 키(key)와 밸류(value) 값을 저장한다.
request.setAttribute(...)과 비슷한 역할을 한다.
- model에서 view 영역이 좀 더 확장
- model과 view를 동시에 설정이 가능한 컨트롤러는 Model과 view가 모두 리턴 가능
- 데이터만 저장한다 vs 데이터와 이동하고자 하는 viewPage를 같이 저장한다.
- 컨트롤러 : 웹 MVC의 컨트롤러 역할
- 서비스 : 핵심 비지니스 로직 구현
- 레파지토리 : 데이터베이스에 접근
- 도메인 : 비지니스 도메인 객체, 예) 회원가입 도메인, 주문 도메인, 쿠폰 도메인 등등
@Controller
✔️ Controller 역할을 하는 class에 붙여준다.
✔️ Controller에서 mapping url을 찾는다.
@GetMapping / @PostMapping
✔️ get 방식의 요청과 post 방식의 요청
@RequestParam("name")
✔️ request.getParameter("name")과 같은 의미
[HelloController.java]
/*
* @Controller : Controller 역할을 하는 class에 붙여준다.
* Controller에서 mapping url을 찾는다.
* 현재 : localhost:9090/hello
*/
@Controller
public class HelloController {
/*
* @GetMapping : get 방식의 요청
*/
@GetMapping("/hello")
public String hello(Model model) {
System.out.println("hello 도착");
model.addAttribute("data", "hello!!!");
return "hello"; // hello.html 화면을 찾아서 return
/*
* 컨트롤러에서 리턴 값으로 문자를 반환하면 뷰 리졸버(viewRewolver)가 화면을 찾아서 처리
* - 스프링 부트 템플릿엔진 기본 viewName 매핑
* - resources : templates/ + {viewName} + .html
*/
}
}
[hello.html]
<!DOCTYPE html>
// 타임리프를 사용하기 위해 넣어줘야하는 태그
<html xmlns:th="http://www.thymeleaf.org">
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<p th:text="'안녕하세요. ' + ${data}">안녕하세요. 손님</p>
</body>
</html>
[HelloController.java]
@Controller
public class HelloController {
/*
* @RequestParam("name")
* - request.getParameter("name")
*
* **옵션**
* required : 파라미터 값 필수 여부, true = 필수 (default) / false = 필수 아님
* defaultValue : 파라미터 값이 없을 경우 기본으로 들어갈 값
*
*/
// http://localhost:9090/hello-mvc?name=Spring
@GetMapping("/hello-mvc")
public String helloMvc(@RequestParam(value = "name", required = false,
defaultValue = "required test") String username, Model model) {
model.addAttribute("modelvalue", username);
return "hello-template";
}
}
[hello-template.html]
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<p th:text="'hello not empty ' + ${modelvalue}">empty!!</p>
</body>
</html>