🍃프로그래머스 백엔드 데브코스 4기 교육과정을 듣고 정리한 글입니다.🍃
Spring MVC 처리 흐름
그림 출처
DispatcherServlet
- Front Controller 패턴을 구현한 Spring MVC의 핵심 컨트롤러
- 클라이언트의 모든 요청을 중앙 집중적으로 처리
- 요청 처리를 위해 HandlerMapping에게 컨트롤러 선택을 위임하고, ViewResolver에게 뷰 선택을 위임
- 선택된 컨트롤러의 실행과 뷰 렌더링 처리를 위해 HandlerAdapter와 ViewResolver와 협력
HandlerMapping
- 클라이언트의 요청을 어떤 컨트롤러가 처리할지를 결정하는 역할을 수행
- 주로 URL 패턴 기반으로 요청과 컨트롤러를 매핑
- 여러 개의 HandlerMapping을 등록하여 우선순위에 따라 매핑을 시도
HandlerAdapter
- 선택된 컨트롤러의 메서드를 실행하는 역할을 수행
- 컨트롤러의 메서드를 호출하고, 결과를 DispatcherServlet에 반환
- HTTP 요청을 적절한 인자값으로 만들어주는 역할 수행
- 다양한 컨트롤러 타입과 메서드를 처리할 수 있는 유연성을 제공
ViewResolver
- 컨트롤러에서 반환된 뷰 이름을 실제 뷰 객체로 변환
- 주로 뷰 이름과 뷰 객체 간의 매핑을 담당하며, 뷰의 논리 이름과 물리적인 위치를 연결
- 다양한 ViewResolver를 사용하여 다양한 뷰 템플릿 엔진과 통합 가능
동작 과정
- 클라이언트의 요청은 DispatcherServlet에 의해 받아짐
- DispatcherServlet은 클라이언트 요청을 처리할 Controller를 선택하기 위해 HandlerMapping에게 위임
- HandlerMapping은 요청 URL에 매핑되는 적절한 Controller(핸들러)를 선택
- 선택된 Controller는 비즈니스 로직 처리를 위해 HandlerAdapter에게 실행을 위임
- HandlerAdapter는 HTTP 요청을 적절한 인자값으로 만들어 사용해서 선택된 Controller의 비즈니스 로직을 호출
- Controller는 비즈니스 로직을 실행하고, 처리 결과를 Model에 설정하고, 뷰의 논리 이름을 HandlerAdapter로 반환
- DispatcherServlet은 반환된 뷰 이름을 이용하여 실제 View 객체를 찾기 위해 ViewResolver에게 위임
- ViewResolver는 뷰 이름에 매핑되는 실제 View 객체를 반환
- DispatcherServlet는 반환된 View 객체에게 뷰 렌더링 처리를 위임
- View는 Model 정보를 렌더링하여 생성된 응답을 클라이언트에게 반환
예시 코드
@Controller
public class HelloController {
@RequestMapping(value = "/hello", method = RequestMethod.GET)
public String hello(Model model) {
model.addAttribute("message", "Hello, Spring MVC!");
return "hello";
}
}
- DispatcherServlet
- 클라이언트가 "/hello" URL로 GET 요청을 보냄
- DispatcherServlet이 모든 요청을 받아서 중앙 집중적으로 처리
- HandlerMapping
- DispatcherServlet은 HandlerMapping에게 "/hello" URL에 매핑되는 컨트롤러를 찾도록 위임
- @RequestMapping(value = "/hello", method = RequestMethod.GET) 어노테이션에 의해 HelloController 클래스의 hello() 메서드가 "/hello" URL과 매핑
- HandlerAdapter
- HandlerAdapter에게 매핑(선택)된 컨트롤러(HelloController)의 hello() 메서드를 호출하도록 위임
- hello() 메서드의 파라미터인 Model model에 HandlerAdapter가 적절한 인자값을 넣어 메서드를 호출
- Controller
- HelloController 클래스의 hello() 메서드가 실행
- Model 객체에 "message"라는 키에 "Hello, Spring MVC!"라는 값이 추가
- ViewResolver
- hello() 메서드가 반환한 문자열 "hello"를 ViewResolver에게 전달
- ViewResolver는 "hello"라는 논리 이름을 기반으로 실제 뷰 객체를 조회
- View
- 찾은 뷰(JSP 파일)에서 Model에 추가된 "message" 속성 값을 렌더링하여 최종적으로 HTML 페이지를 생성
- 최종적으로 생성된 HTML 페이지가 클라이언트에게 응답으로 전달