Spring

Spring MVC의 구조와 HttpMessageConverter의 역할

김예나 2025. 2. 24. 18:02

HttpMessageConverter

@RequestBody, @ResponseBody 을 사용할때 사용됨 → 요청이나 응답 모두에 사용된다는 의미

  • 요청시에는 Argument Resolver가 사용
  • 응답시에는 ReturnValueHandler가 사용
  • JSON을 객체로 변환하는데는 Jackson 라이브러리 사용 (@JsonFormat, Deserializer)

 

HttpMessageConverter 우선순위

  1. ByteArrayHttpMessageConverter : byte[] Data를 처리
  2. StringHttpMessageConverter : String Data를 처리
  3. MappingJackson2HttpMessageConverter : JSON Data를 처리

 

HttpMessageConverter 동작 순서

읽기

  1. 클라이언트가 HTTP 요청을 보냄
  2. Spring MVC가 컨트롤러의 @RequestBody를 확인하고 MessageConverter를 실행
  3. MessageConverter는 canRead() 메서드로 읽기가능 여부를 조회
    • 요청 데이터 타입이 지원 가능한지 (ex: application/json )
    • 변환할 객체 타입이 적절한지 (ex: RequestDto를 만들 수 있는지)

4. read() 메서드를 호출하여 객체 생성 : JSON 데이터를 RequestDto 객체로 변환

 

쓰기

  1. 컨트롤러 메서드에서 객체 반환 : return responseDto
  2. @ResponseBody가 붙어 있으므로 스프링에서 HttpMessageConverter가 실행
  3. canWrite()를 호출하여 데이터 변환 가능 여부 확인
    • 반환 클래스가 byte[], String, Object 인지 여부 확인
    • 요청 헤더 Accept 의 Media Type 지원여부 확인(produces)
  4. write() 메서드를 호출 : HTTP Response Message Body에 데이터를 입력

 

Spring MVC 구조

  • HandlerMappingList를 조회하여 적절한 컨트롤러 찾기
    • 여러 개의 HandlerMapping을 순차적으로 조회하면서 요청을 처리할 컨트롤러(Handler)를 찾음
    • ex) RequestMappingHandlerMapping : @RequestMapping으로 해당 핸들러를 찾음
    • GET /users/1 요청이 오면 RequestMappingHandlerMapping **@RequestMapping("/users/{id}")가 있는 컨트롤러를 찾아 반환
  • HandlerAdapter는 찾은 컨트롤러를 실행할 수 있도록 변환해 주는 역할
    • 찾은 컨트롤러의 실행을 담당
  • 찾은 컨트롤러의 메서드를 실행하고 결과를 반환
    • @RequestMapping("/users/{id}")가 있는 컨트롤러 메서드 실행

 

RequestMappingHandlerAdapter

  • @RequestMapping (@PostMapping , @GetMapping)을 처리하는 HandlerAdapter의 구현체

 

ArgumentResolver

  • 요청이 컨트롤러 메서드에 전달될 때 각 파라미터를 적절한 객체로 변환하여 주입하는 것을 담당
  • RequestMappingHandlerAdapter는 ArgumentResolver를 호출하여 Controller가 필요한 다양한 파라미터의 값을 생성
  • HttpServletRequest, Model, HttpEntity,@ModelAttribute, @RequestBody, @RequestParam 등 다양한 파라미터 바인딩을 할 수 있는 이유
  • HandlerMethodArgumentResolver
    • ArgumentResolver의 실제 이름, 인터페이스로 구성됐기에 mplements 하여 확장 가능

 

ReturnValueHandler

  • ModelAndView, @ResponseBody, HttpEntity<> 등이 있으면 응답에 필요한 값으로 변환
  • Controller에서 String으로 ViewName을 반환하여도 View가 동작하는 이유
  • HandlerMethodReturnValueHandler
    • ReturnValueHandler의 실제 이름, 인터페이스로 구성됐기에 mplements 하여 확장 가능