[7/4 TIL] SPRING MVC(Spring MVC 처리 흐름)

yumyeonghan·2023년 7월 4일
0

🍃프로그래머스 백엔드 데브코스 4기 교육과정을 듣고 정리한 글입니다.🍃

Spring MVC 처리 흐름

그림 출처

DispatcherServlet

  • Front Controller 패턴을 구현한 Spring MVC의 핵심 컨트롤러
  • 클라이언트의 모든 요청을 중앙 집중적으로 처리
  • 요청 처리를 위해 HandlerMapping에게 컨트롤러 선택을 위임하고, ViewResolver에게 뷰 선택을 위임
  • 선택된 컨트롤러의 실행과 뷰 렌더링 처리를 위해 HandlerAdapter와 ViewResolver와 협력

HandlerMapping

  • 클라이언트의 요청을 어떤 컨트롤러가 처리할지를 결정하는 역할을 수행
  • 주로 URL 패턴 기반으로 요청과 컨트롤러를 매핑
  • 여러 개의 HandlerMapping을 등록하여 우선순위에 따라 매핑을 시도

HandlerAdapter

  • 선택된 컨트롤러의 메서드를 실행하는 역할을 수행
  • 컨트롤러의 메서드를 호출하고, 결과를 DispatcherServlet에 반환
  • HTTP 요청을 적절한 인자값으로 만들어주는 역할 수행
  • 다양한 컨트롤러 타입과 메서드를 처리할 수 있는 유연성을 제공

ViewResolver

  • 컨트롤러에서 반환된 뷰 이름을 실제 뷰 객체로 변환
  • 주로 뷰 이름과 뷰 객체 간의 매핑을 담당하며, 뷰의 논리 이름과 물리적인 위치를 연결
  • 다양한 ViewResolver를 사용하여 다양한 뷰 템플릿 엔진과 통합 가능

동작 과정

  1. 클라이언트의 요청은 DispatcherServlet에 의해 받아짐
  2. DispatcherServlet은 클라이언트 요청을 처리할 Controller를 선택하기 위해 HandlerMapping에게 위임
  3. HandlerMapping은 요청 URL에 매핑되는 적절한 Controller(핸들러)를 선택
  4. 선택된 Controller는 비즈니스 로직 처리를 위해 HandlerAdapter에게 실행을 위임
  5. HandlerAdapter는 HTTP 요청을 적절한 인자값으로 만들어 사용해서 선택된 Controller의 비즈니스 로직을 호출
  6. Controller는 비즈니스 로직을 실행하고, 처리 결과를 Model에 설정하고, 뷰의 논리 이름을 HandlerAdapter로 반환
  7. DispatcherServlet은 반환된 뷰 이름을 이용하여 실제 View 객체를 찾기 위해 ViewResolver에게 위임
  8. ViewResolver는 뷰 이름에 매핑되는 실제 View 객체를 반환
  9. DispatcherServlet는 반환된 View 객체에게 뷰 렌더링 처리를 위임
  10. 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"; // 뷰의 논리 이름을 반환 (ViewResolver를 통해 실제 뷰를 찾음)
    }
}
  • 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 페이지가 클라이언트에게 응답으로 전달
profile
웹 개발에 관심 있습니다.

0개의 댓글