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

DispatcherServlet 은 필터 다음 스프링 컨텍스트에서 가장 먼저 요청을 받는 프론트 컨트롤러이다.
👉 인터셉터가 컨트롤러로 요청을 위임하지는 않으나 흐름 순서가 위의 그림과 같다.
어느 컨트롤러가 요청을 처리할 수 있는지를 식별해야 하는데, 해당 역할을 하는 것이 바로 HandlerMapping이다.
RequestMappingHandlerMapping이 처리하며, @Controller 로 작성된 모든 컨트롤러를 찾고 파싱하여 HashMap<요청 정보, 처리할 대상>으로 관리한다. 처리할 대상은 HandlerMethod 객체로 컨트롤러, 메서드 등을 갖고 있으며 이는 스프링이 리플렉션을 이용해 요청을 위임하기 때문이다.
요청이 오면 HttpMethod, URI 등을 사용해 요청 정보를 만들고, HashMap에서 요청을 처리할 대상을 찾은 후에 HandlerExecutionChain 으로 감싸서 반환한다.
→ HandlerExecutionChain 으로 감싼 이유는 컨트롤러로 요청을 넘겨주기 전에 처리해야하는 인터셉터 등을 포함하기 위해서이다.
🔎 로그인 필터쪽에서 요청 컨트롤러와 메서드를 로그로 찍어보기
다양하게 작성되는 컨트롤러에 대응하기 위해 스프링은 HandlerAdapter라는 어댑터 인터페이스를 통해 어댑터 패턴을 적용함으로써 컨트롤러의 구현 방식에 상관없이 요청을 위임할 수 있도록 한다.

📚 Spring MVC에서 HTTP 요청을 컨트롤러 메서드에 매핑하고 실행하는 핵심 구성 요소로, 클라이언트 요청을 적절한 컨트롤러 메서드와 연결한 후 이 메서드를 호출하여 결과를 반환하는 역할을 수행
📑 [공식문서] 사용 가능한 파라미터 목록
https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-controller/ann-methods/arguments.html

HttpMessageConverter 적용@RequestBody, HttpEntity<>, RequestEntity<>@ResponseBody, HttpEntity<>, ResponseEntity<>👉 요청과 응답 모두 사용된다.
canRead(), canWrite()
Class(Byte[], String, Object), MediaType(*/*, application/json) 지원여부 체크
read(), write()
HttpMessage를 읽고 쓴다.
Request[canRead(), read()], Response[canWrite(), write()] 양방향으로 동작
요청 데이터를 아래의 우선순위로 판단, 대상 class와 MediaType이 일치하지 않으면 동작하지 못한다.
Byte[] */*application/octet-streamString */*text/plainObject, HashMap application/json 👉 일치하지 않으면 415 Unsupported Media Type 📚 Spring MVC에서 컨트롤러 메서드가 반환하는 값을 처리하여 HTTP 응답에 맞게 변환하는 역할을 하는 인터페이스로 컨트롤러 메서드가 실행된 후 그 반환값을 HTTP 응답의 본문에 적절히 담아 전송할 수 있도록 도와준다.
🔗 참고
[Spring] Dispatcher-Servlet(디스패처 서블릿)이란? 디스패처 서블릿의 개념과 동작 과정