시냅스

Spring MVC 구조 : 핸들러어댑터 ,핸들러 매핑, 메세지 컨버터 handler mapping handler adapter, message converter 본문

Java, Spring

Spring MVC 구조 : 핸들러어댑터 ,핸들러 매핑, 메세지 컨버터 handler mapping handler adapter, message converter

ted k 2022. 8. 2. 17:28

  • 프론트 컨트롤러 패턴으로 이뤄져있다.
  • 서블릿이 호출되면 HttpServlet이 제공하는 service가 호출된다.
  • 스프링 mvc는 DispatcherServlet의 부모인 FrameworkServlet에서 service를 override해두었다.
  • FrameworkServlet.service를 시작으로 여러 메서드가 호출되면서 DispatcherServlet.doDispatch()가 호출된다.
  • doDispatch()는 다음과 같다.
    • 요청이 들어오면 핸들러 매핑을 통해 핸들러(컨트롤러)를 조회할 수 있는지 확인하고
    • 핸들러 어댑터 목록에서 핸들러를 처리할 수 있는 핸들러 어댑터가 있는지 확인해서
    • 핸들러 어댑터를 통해 핸들러의 컨트롤러를 실행하고 반환하는 정보를 ModelAndView로 변환해서 반환한다.
    • 반환 받은 modelandview에서 model을 view에 전달하여 view를 응답으로 보내준다.

 

핸들러 매핑과 핸들러 어댑터

컨트롤러가 호출되려면 다음 2가지가 필요하다.

  • HandlerMapping(핸들러 매핑)
    • 핸들러 매핑에서 컨트롤러를 찾을 수 있어야 한다.
    • e.g. 스프링 빈의 이름으로 핸들러를 찾을 수 있는 핸들러 매핑이 필요하다.
    • 0 = RequestMappinghandlerMapping : 애노테이션 기반의 컨트롤러인 @RequestMapping에서 사용
    • 1 = BeanNameUrlHandlerMapping : 스프링 빈의 이름으로 핸들러를 찾는다.
  • HandlerAdapther(핸들러 어댑터)
    • 핸들러 매핑을 통해서 찾은 핸들러를 실행할 수 있는 핸들러 어댑터가 필요하다.
    • e.g. Conroller 인터페이스를 실행할 수 있는 핸들러 어댑터를 찾고 실행해야 한다.
    • 0 = RequestMappingHandlerAdapter : 애노테이션 기반의 컨트롤러인 @RequestMapping에서 사용
    • 1 = HttpRequestHandlerAdapter : HttpRequestHandler 처리
    • 2 = SimpleControllerHandlerAdapter : Controller 인터페이스 (애노테이션X, 과거에 사용)처리

 

HTTP 메세지 컨버터

  • HTML을 생성해서 응답하는 것이 아니라, HTTP API처럼 JSON 데이터를 HTTP 바디에서 직접 읽거나 쓰는 경우
  • @ResponseBody를 사용
    • HTTP의 BODY에 문자 내용을 직접 반환
    • viewResolver 대신 HttpMessageConverter가 동작
    • 기본 문자 처리 : StringHttpMessageConverter
    • 기본 객체 처리 : MappingJackson2HttpMessageConverter
    • byte 처리 등등 기타 여러 HttpMessageConverter가 기본으로 등록되어 있음
  • HTTP 요청 : @RequestBody, HttpEntity(RequestEntity)
  • HTTP 응답 : @ResponseBody, HttpEntity(ResponseEntity)
  • 0 = ByteArrayHttpMessageConverter
    • byte[] 데이터 처리
    • 클래스 타입 : byte[], 미디어 타입 */*
  • 1 = StringHttpMessageConverter
    • String 문자로 데이터 처리
    • 클래스 타입 : String, 미디어 타입 : */*
  • 2 = MappingJackson2httpMessageconverter
    • application/json
    • 클래스 타입 : 객체 또는 HashMap, 미디어 타입 : application/json

 

RequestMappingHandlerAdapter 동작 방식

  • ArgumentsResolver(다양한 인자를 받을 수 있게 해준다.)를 호출해서 해당 파라미터를 지원하는지 체크 후 실제 객체를 생성하여 객체가 컨트롤러 호출 시 넘어간다.
  • ReturnValueHandler (다양한 응답 값을 지원한다.)
  • 요청의 경우 ArgumentResolver로 HTTP 메세지 컨버터를 사용해서 필요한 객체를 생성한다.
  • 응답의 경우 ReturnValueHandler를 통해 HTTP 메세지 컨버터를 호출해서 응답 결과를 만든다.
Comments