📘 Spring MVC 흐름
1️⃣ Request
- 클라이언트(브라우저, 모바일 앱 등)가 특정 URL로 HTTP 요청을 보낸다.
- 요청(request)은 DispatcherServlet에 도착한다.
2️⃣ HandlerMapping
- DispatcherServlet은 받은 요청(URL)을 바탕으로 HandlerMapping에게 **요청(URL)**을 처리 할 controller가 있는지 찾는 것을 부탁한다.
- Handler Mapping은 등록된 URL과 Controller의 매핑 정보를 바탕으로 요청을 처리할 Controller를 찾는다.
@Controller
public class TestController {
@RequestMapping("/hello")
public String sayHello() {
return "hello";
}
}
코드로 매핑 설명
- HandlerMapping은 @RequestMapping("/hello") 어노테이션을 기반으로 요청(=hello) 과 Controller 메서드의 매핑 정보를 확인한다.
- /hello 요청 → TestController의 sayHello() 메서드와 매핑된다.
- HandlerMapping은 해당되는 Handler 정보를 DispatcherServlet에 **전달(=반환)**한다.
- Handler 정보는 요청 처리에 필요한 데이터(Controller 객체( = TestController), 메서드( = sayHello) , 매개변수 등)를 포함한다.
3️⃣ Handler Adapter
@Controller
public class TestController {
@RequestMapping("/hello")
public String sayHello() {
return "hello";
}
}
DispatcherServlet이 요청을 처리할 Handler(Controller)를 찾으면, 해당 Handler를 실제로 실행하는 역할을 한다.
- 코드 예시 : TestController의 sayHello() 메서드를 호출하고, sayHello() 메서드는 hello라는 논리적 뷰 이름을 반환한다.
- 해당되는 controller의 메서드 실행해줌 (=ex. sayHello() 실행)
- 논리적 뷰 이름 말고도, Handler Adapter는 mode, view name, model and view 정보 등을 반환할 수 있다
1️⃣ view name 반환 예시
- view name(=users ) 과 model( = test) 데이터를 반환
public class TestController { @GetMapping("/users") public String getUsers(Model model) { Test test = new Test("test","testData111"); model.addAttribute("test", test); return "users"; // View 이름 반환 } }
2️⃣ modelAndView 반환 예시
- ModelAndView를 사용하면 데이터를 추가하고 뷰 이름을 반환하는 작업을 한 객체에서 처리할 수 있다.
- ModelAndView(=mav) 반환
@GetMapping("/users") public ModelAndView getUsers() { Test test = new Test("test", "testData111"); ModelAndView mav = new ModelAndView("users"); // 뷰 이름 설정 mav.addObject("test", test); // 데이터 추가 return mav; }
HandlerAdapter는 메서드의 매개변수 정보를 보고, 필요한 데이터를 HTTP 요청에서 추출할 수 있다.
- 예시 : @RequestParam, @PathVariable, @ModelAttribute 등
4️⃣ View Resolver
- Controller에서 반환된 논리적 뷰 이름을 받아서, 실제로 사용될 View 객체( 예: JSP 파일, Thymeleaf 템플릿 , 물리적 뷰 경로 등)를 찾아 반환하는 역할을 한다. => 템플릿, 뷰의 논리적 이름을 실제 위치가 있는 물리적 경로 반환
public class TestController {
@GetMapping("/users")
public String getUsers(Model model) {
Test test = new Test("test","testData111");
model.addAttribute("test", test);
return "users"; // View 이름 반환
}
}
- View Resolver는 설정 파일에 정의된 prefix와 suffix를 붙여서 뷰의 실제 경로를 만든 후, 해당 경로를 처리할 수 있는 View 객체를 찾거나 생성해서 반환한다.
- View 객체에는 사용할 템플릿, 뷰의 논리적 이름을 실제 위치가 있는 물리적 경로 등이 들어가져 있다/
- 논리적 뷰 이름: users
- 실제(물리적) 뷰 경로: /WEB-INF/views/users.jsp (설정에 따라 다를 수 있다.)
- 결론 : 논리적 뷰 이름 ⇒ 물리적 뷰 경로로 변경
- View Resolver는 최종 경로에 해당하는 View 객체(예: InternalResourceView)를 반환함.
- 찾으면? → View 객체 반환.
- 못 찾으면? → 예외 발생 또는 비어 있는 View 객체 반환.
5️⃣ View
- View는 ViewResolver가 찾아준 물리적 경로를 사용해 실제 클라이언트에 보낼 UI를 생성하는 역할을 해준다.
- view는 Model 데이터(예: name= Test)를 HTML 템플릿에 삽입한다.
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org/" >
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1 th:text="'hello' + ${name} + '!!'"></h1>
</body>
</html>
- HTML이나 JSP 파일 등 을 렌더링.
3. 렌더링된 최종 결과를 클라이언트(브라우저)에 응답으로 반환.
- 여기서 name이 test 라면 hellotest!!가 반환될 것이다.
<h1>hellotest!!</h1>
'스프링 | 스프링 부트' 카테고리의 다른 글
[ Spring ] @RequiredArgsConstructor란 ? (0) | 2025.02.07 |
---|---|
[ Spring ] @Transactional과 예시 (0) | 2025.02.07 |
MVC 패턴이란? (1) | 2025.01.21 |
웹 서버와 WAS란 ? (0) | 2025.01.20 |
[ Spring Boot ] 프레임워크와 라이브러리 (0) | 2025.01.17 |