
- DispatcherServlet : Spring의 프론트 컨트롤러
- 프론트 컨트롤러 패턴 : Servlet(Controller)이 호출되기 전에 공통 기능을 하나의 Servelt에서 처리해주는 패턴이다.
프론트 컨트롤러 하나에 모든 클라이언트측 요청이 들어온다!
- 프론트 컨트롤러 패턴 : Servlet(Controller)이 호출되기 전에 공통 기능을 하나의 Servelt에서 처리해주는 패턴이다.
- Spring MVC 구조 실행 순서
- 1. 요청
Client(사용자)가 브라우저에서 URL을 입력하거나 버튼을 누르면 HTTP 요청(Request)이 만들어지고, 이 요청이 Dispatcher Servlet에 전달된다. - 2. 핸들러 찾기
- DispatcherServlet은 요청을 보고 어떤 컨트롤러(Handler)가 처리해야 하는지 HandlerMapping을 통해 찾는다.
(여기서 컨트롤러는 요청을 처리하는 실제 로직을 담고 있는 클래스)
Q : 어떤 컨트롤러가 처리할 때 GET, POST등을 말하는가?
A : 예시- 사용자가 /products URL로 GET 요청을 보낸다.
- 예를 들어, http://example.com/products로 들어온 요청.
- Spring은 HandlerMapping을 통해 /products를 처리하는 컨트롤러를 찾는다
- GET 요청이면 해당 컨트롤러의 @GetMapping("/products") 메서드를 실행한다.
- 즉, URL과 HTTP메서드(GET, POST 등)를 기반으로 요청을 처리할 컨트롤러와 메서드를 결정
- 사용자가 /products URL로 GET 요청을 보낸다.
- DispatcherServlet은 요청을 보고 어떤 컨트롤러(Handler)가 처리해야 하는지 HandlerMapping을 통해 찾는다.
- 3~4. Handler Adapter 찾기
- 컨트롤마다 동작 방식이 다를 수 있으므로, 이를 적절히 연결해 주는 도우미가 필요한데, 이 도우미가 HandlerAdapter이다.
이를 현대 Spring에서 이해하자면 애노테이션 기반 메서드 호출이라고 생각하면 된다!
ex) HandlerAdapter는 @Controller로 정의된 클래스 안에 정의된 @RequestMapping, @GetMapping등을 호출하는 것!
더 쉽게 표현하자면 @Controller라는 큰 건물 안에 @GetMapping, @PostMapping, @RequestMapping 등 방들이 있는데 HandlerAdapter가 방을 찾아 들어간다.
- 컨트롤마다 동작 방식이 다를 수 있으므로, 이를 적절히 연결해 주는 도우미가 필요한데, 이 도우미가 HandlerAdapter이다.
- 5~7. 컨트롤러 호출 및 처리
- 찾아낸 Handler(Controller)를 실행하여 요청을 처리하고, 처리 결과(데이터)를 반환한다.
- 예를 들어, 사용자가 상품 목록을 요청했다면, 컨트롤러가 데이터베이스에서 상품 정보를 가져온다.
- 8~9. View 이름 찾기(ModelAndView & View Resolver)
- 컨트롤러는 ModelAndView라는 객체를 반환한다.
- View: 사용자에게 보여줄 화면의 이름(예: productList.jsp).
- Model: 컨트롤러가 가져온 데이터(상품 목록 등).
- View Resolver는 이 이름을 보고 어떤 파일을 사용자에게 보여줄지 결정한다.
여기서 이 이 이름이란? 컨트롤러가 데이터를 처리한 후, 어떤 화면(View)을 보여줄지를 문자열로 반환하는데, 이것이 View의 이름이다!
- 10~11. View 렌더링
- View 파일이 데이터를 받아 실제로 HTML을 생성
- 1. 요청
@Controller
public class ProductController {
@GetMapping("/products")
public String listProducts(Model model) {
// 로직 실행 (예: 상품 목록 가져오기)
model.addAttribute("products", productService.getProducts());
return "productList"; // View 이름 반환
}
}
MVC 구조 흐름을 쉽게 비유하자면
1. 손님(사용자)이 요청(request)을 보낸다.
2. 건물 안내원(HandlerMapping)이 적절한 건물(@Controller)을 찾아준다.
➡️ 그럼 궁금증이 생길 수 있다. @Controller가 여러 개일 수 있나?
➡️ 당연하다. 애플리케이션의 각 기능(회원 관리, 상품 관리 등)을 따로 관리하면 코드 복잡도가 줄고 협업의 효율성을 증가 시킬 수 있다.
3. 문 열고 들어갈 사람(HandlerAdapter)이 방(@GetMapping, @PostMapping)을 찾아 적절히 들어가 실행한다.
4. 방 안에서 일을 마치고 결과(response)를 손님에게 돌려준다.
'Back-End > Spring-MVC' 카테고리의 다른 글
| HTTP 응답 데이터 (1) | 2024.12.02 |
|---|---|
| HTTP 요청 데이터 (1) | 2024.12.02 |
| @RequestMapping (0) | 2024.12.01 |
| @Controller 와 @RestController 요약 정리 (0) | 2024.12.01 |
| Spring MVC가 나오게 된 이유 (0) | 2024.11.30 |