티스토리 뷰

IT/Spring

Spring MVC 요청 처리 흐름 완전 정복 - DispatcherServlet부터 Controller까지

Stv 2025. 7. 2. 20:16

목차


    ✅1. Spring MVC란?

    Model-View-Controller 아키텍처를 기반으로 하는 웹 프레임워크
    • Model : 데이터와 비즈니스 로직
    • View : 사용자에게 보여지는 UI
    • Controller : 사용자 요청을 받고 적절한 응답을 돌려주는 역할 

    2. 요청 처리 흐름 한눈에 보기

    Client
      ↓
    DispatcherServlet
      ↓
    HandlerMapping
      ↓
    HandlerAdapter
      ↓
    Controller
      ↓
    ModelAndView
      ↓
    ViewResolver
      ↓
    View (JSP, Thymeleaf 등)
      ↓
    Response to Client

    3. DispatcherServlet : Spring MVC의 핵심 진입점

    web.xml 또는 Spring Boot에서는 자동 등록되는 Front Controller
    @WebServlet(name = "dispatcherServlet", urlPatterns = "/")
    public class DispatcherServlet extends FrameworkServlet {
        // 요청을 중앙에서 받아 처리함
    }

     

    📌 역할

    • 모든 요청을 받음
    • 알맞은 Controller를 찾고 실행함
    • 반한된 데이터를 View로 변환해서 응답

    4. HandlerMapping : 어떤 컨트롤러가 처리할까?

    URL 요청에 대해 어떤 Handler(= 컨트롤러 메서드)를 호출할지 결정
    • @RequestMapping 기반으로 매핑된 컨트롤러 목록을 보유
    • 요청 URL에 가장 적합한 핸들러를 찾아 반환
    HandlerExecutionChain handler = handlerMapping.getHandler(request);

    5. HandlerAdapter : Handler를 실행할 수 있는 Adapter 선택

    찾은 Handler를 실제로 실행할 수 있도록 도와주는 어댑터
    • Controller가 어떤 타입이든 실행 가능하도록 추상화
    • @Controller, @RestController, HttpRequestHandler, SimpleController 등 다양한 핸들러 처리 가능

    6. Controller : 비즈니스 로직 수행

    @GetMapping("/hello")
    public String hello(Model model) {
        model.addAttribute("msg", "Hello, Spring!");
        return "helloView";
    }
    • 요청 처리 후 View 이름 또는 데이터를 반환
    • 반환값은 ModelAndView 또는 ResponseEntity, @ResponseBody

    7. ModelAndView : 모델과 뷰 정보 담는 객체

    ModelAndView mav = new ModelAndView("helloView");
    mav.addObject("msg", "Hello, Spring!");
    return mav;
    • View 이름 + Model 데이터를 함께 담음

    8. ViewResolver : 어떤 뷰를 보여줄까?

    ViewResolver는 View 이름을 기반으로 실제 뷰 파일(JSP, Thymeleaf 등)을 찾아 반환
    InternalResourceViewResolver → /WEB-INF/views/helloView.jsp
    • 여러 ViewResolver를 체인으로 등록 가능

    9. View : 최종 응답 처리 (렌더링)

    JSP, Thymeleaf, JSON 등 클라이언트에게 실제 보여지는 결과물 생성
    • 모델 데이터를 바탕으로 HTML 또는 JSON 생성
    • @ResponseBody나 RestController의 경우 -> ViewResolver 없이 JSON 직접 반환

    10. Spring MVC 요청 흐름 예제

    @GetMapping("/users/{id}")
    public ResponseEntity<User> getUser(@PathVariable Long id) {
        return ResponseEntity.ok(userService.findById(id));
    }
    1. /users/1 요청 도착
    2. DispatcherServlet이 요청 받음
    3. HandlerMapping이 getUser() 컨트롤러 메서드 매핑
    4. HandlerAdapter가 메서드 실행
    5. 컨트롤러 로직 실행 -> User 객체 반환
    6. JSON 형태로 변환 후 응답

    11. 실무 포인트

    항목 설명
    URL 패턴 충돌 동일 URL에 대한 중복 매핑 피해야 함
    ViewResolver Thymeleaf/JSP 등 우선순위 설정 필요
    REST API @RestController, @ResponseBody는 ViewResolver 패스
    인터셉터/필터 DispatcherServlet 전/후단에 위치, 요청 전처리/후처리 가능
    예외 처리 @ControllerAdvice + ExceptionHandler 사용

    ✅ 마무리 요약

    단계  컴포넌트 역할 요약
    DispatcherServlet 모든 요청의 진입점
    2 HandlerMapping 어떤 컨트롤러를 실행할지 결정
    3 HandlerAdapter 핸들러 실행을 지원
    4 Controller 요청 처리 및 데이터 생성
    5 ViewResolver View 이름 -> 실제 뷰 변환
    6 View HTML/JSON 결과 응답 생성