Spring

[Spring] DispatcherServlet 동작 흐름

snail voyager 2025. 5. 2. 00:08
728x90
반응형

DispatcherServlet 

Spring MVC의 핵심 요소인 DispatcherServlet은 Front Controller 역할을 하며,

모든 요청을 중앙에서 처리하고 적절한 컴포넌트로 분배하는 역할

1. DispatcherServlet 동작 개요

클라이언트가 HTTP 요청을 보내면 DispatcherServlet이 이를 가로채고, 내부적으로 여러 컴포넌트(HandlerMapping, HandlerAdapter, ViewResolver 등)를 사용하여 요청을 처리한 후 응답을 반환합니다.

2. DispatcherServlet의 요청 처리 흐름

① 클라이언트 요청 수신

클라이언트가 GET /api/users 같은 HTTP 요청을 보냅니다.
Spring Boot 애플리케이션에서는 DispatcherServlet이 기본적으로 / 경로에 매핑되어 있기 때문에 모든 요청이 DispatcherServlet을 거치게 됩니다.

② DispatcherServlet이 요청을 처리할 Handler 찾기 (HandlerMapping)

DispatcherServlet은 요청을 처리할 적절한 컨트롤러를 찾기 위해 HandlerMapping을 사용합니다.

Spring Boot에서는 기본적으로 RequestMappingHandlerMapping이 동작하며, @RequestMapping 또는 @GetMapping 등으로 매핑된 컨트롤러 메서드를 찾아냅니다.

③ HandlerAdapter를 이용하여 컨트롤러 실행

적절한 컨트롤러(핸들러)를 찾았으면, HandlerAdapter가 해당 핸들러를 실행합니다.

Spring Boot에서는 기본적으로 RequestMappingHandlerAdapter가 사용됩니다.
이 과정에서 다음을 수행합니다.

  • 요청 파라미터 바인딩 (@RequestParam, @PathVariable, @RequestBody 등)
  • 유효성 검사 (@Valid, @Validated 적용)
  • 비즈니스 로직 실행 (서비스 호출 등)
  • 결과를 반환 (ResponseEntity, ModelAndView, JSON 등)

④ 컨트롤러가 반환한 데이터를 변환 (HttpMessageConverter)

컨트롤러에서 반환된 데이터는 HttpMessageConverter를 통해 적절한 형식(JSON, XML 등)으로 변환됩니다.

(1) JSON 변환 (기본 설정)

Spring Boot에서는 기본적으로 Jackson 라이브러리(MappingJackson2HttpMessageConverter)를 사용하여 JSON 변환을 수행합니다.

(2) String 응답 변환

만약 컨트롤러가 String을 반환하면, StringHttpMessageConverter가 이를 처리합니다.

⑤ ViewResolver를 사용하여 뷰 찾기 (선택 사항)

컨트롤러가 뷰(View)를 반환하는 경우(@Controller 사용), ViewResolver가 적절한 뷰를 찾습니다.

@Controller
public class PageController {
    
    @GetMapping("/home")
    public String home() {
        return "home";  // home.jsp 또는 home.html을 찾아서 렌더링
    }
}

⑥ 최종적으로 DispatcherServlet이 응답 반환

  • JSON 또는 HTML 응답이 변환되었으면, DispatcherServlet이 HTTP 응답을 클라이언트에게 반환합니다.
  • 이 과정에서 HTTP 상태 코드(200 OK, 400 Bad Request 등)도 함께 설정됩니다.

3. 예외 발생 시 DispatcherServlet의 처리 방식

컨트롤러나 서비스에서 예외가 발생하면, DispatcherServlet은 이를 처리하기 위해 예외 처리 체인을 실행합니다.

  1. @ExceptionHandler를 찾아 예외 처리 (@ControllerAdvice 적용 가능)
  2. HandlerExceptionResolver를 사용하여 예외 해결
  3. 기본 예외 처리기 (DefaultHandlerExceptionResolver, ResponseStatusExceptionResolver 등) 실행
  4. 예외가 해결되지 않으면 sendError()를 호출하여 HTTP 오류 응답 반환

 

728x90
반응형