[Spring] Dispatcher Servlet

Yuri·2025년 2월 21일

Spring

목록 보기
16/21

📕 Today I Learned - 오늘 내가 공부한 것을 정리합니다.

  • Spring의 핵심 기능 중 하나인 HttpMessageConverter를 학습한다.
  • ArgumentResolver와 ReturnValueHandler를 학습하고 Spring의 전체 구조를 익힌다.

Dispatcher-Servlet의 동작과정

1. 클라이언트의 요청을 디스패처 서블릿이 받음

DispatcherServlet 은 필터 다음 스프링 컨텍스트에서 가장 먼저 요청을 받는 프론트 컨트롤러이다.
👉 인터셉터가 컨트롤러로 요청을 위임하지는 않으나 흐름 순서가 위의 그림과 같다.

2. 요청 정보를 통해 요청을 위임할 컨트롤러를 찾음

어느 컨트롤러가 요청을 처리할 수 있는지를 식별해야 하는데, 해당 역할을 하는 것이 바로 HandlerMapping이다.

RequestMappingHandlerMapping이 처리하며, @Controller 로 작성된 모든 컨트롤러를 찾고 파싱하여 HashMap<요청 정보, 처리할 대상>으로 관리한다. 처리할 대상은 HandlerMethod 객체로 컨트롤러, 메서드 등을 갖고 있으며 이는 스프링이 리플렉션을 이용해 요청을 위임하기 때문이다.

요청이 오면 HttpMethod, URI 등을 사용해 요청 정보를 만들고, HashMap에서 요청을 처리할 대상을 찾은 후에 HandlerExecutionChain 으로 감싸서 반환한다.
→ HandlerExecutionChain 으로 감싼 이유는 컨트롤러로 요청을 넘겨주기 전에 처리해야하는 인터셉터 등을 포함하기 위해서이다.

🔎 로그인 필터쪽에서 요청 컨트롤러와 메서드를 로그로 찍어보기

3. 요청을 컨트롤러로 위임할 핸들러 어댑터를 찾아서 전달함

다양하게 작성되는 컨트롤러에 대응하기 위해 스프링은 HandlerAdapter라는 어댑터 인터페이스를 통해 어댑터 패턴을 적용함으로써 컨트롤러의 구현 방식에 상관없이 요청을 위임할 수 있도록 한다.

4. 핸들러 어댑터가 컨트롤러로 요청을 위임함

ArgumentResolver

📚 Spring MVC에서 HTTP 요청을 컨트롤러 메서드에 매핑하고 실행하는 핵심 구성 요소로, 클라이언트 요청을 적절한 컨트롤러 메서드와 연결한 후 이 메서드를 호출하여 결과를 반환하는 역할을 수행

  1. RequestBodyArgumentResolver
  2. RequestHeaderArgumentResolver
  3. HandlerMethodArgumentResolver

📑 [공식문서] 사용 가능한 파라미터 목록
https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-controller/ann-methods/arguments.html

HttpMessageConverter

  • HttpMessageConverter 적용
  1. HTTP 요청: @RequestBody, HttpEntity<>, RequestEntity<>
  2. HTTP 응답: @ResponseBody, HttpEntity<>, ResponseEntity<>

👉 요청응답 모두 사용된다.

HttpMessageConverter 내부구조

  • canRead(), canWrite()
    Class(Byte[], String, Object), MediaType(*/*, application/json) 지원여부 체크

  • read(), write()
    HttpMessage를 읽고 쓴다.

Request[canRead(), read()], Response[canWrite(), write()] 양방향으로 동작

우선순위

요청 데이터를 아래의 우선순위로 판단, 대상 class와 MediaType이 일치하지 않으면 동작하지 못한다.

  1. ByteArrayHttpMessageConverter
    • 대상: Byte[]
    • MediaType: */*
    • 반환: application/octet-stream
  2. StringHttpMessageConverter
    • 대상: String
    • MediaType: */*
    • 반환: text/plain
  3. MappingJackson2HttpMessageConverter
    • 대상: Object, HashMap
    • MediaType: application/json 👉 일치하지 않으면 415 Unsupported Media Type
    • 반환 : application/json

5. 비즈니스 로직을 처리함

6. 컨트롤러가 반환값을 반환함

ReturnValueHandler

📚 Spring MVC에서 컨트롤러 메서드가 반환하는 값을 처리하여 HTTP 응답에 맞게 변환하는 역할을 하는 인터페이스로 컨트롤러 메서드가 실행된 후 그 반환값을 HTTP 응답의 본문에 적절히 담아 전송할 수 있도록 도와준다.

  1. ModelAndViewMethodReturnValueHandler
  2. HttpEntityMethodProcessor
  3. HandlerMethodReturnValueHandler

HttpMessageConverter

7. 핸들러 어댑터가 반환값을 처리함

8. 서버의 응답을 클라이언트로 반환함

🔗 참고
[Spring] Dispatcher-Servlet(디스패처 서블릿)이란? 디스패처 서블릿의 개념과 동작 과정

profile
안녕하세요 :)

0개의 댓글