[Spring] HttpMessageConverter (2)

이연우·2025년 8월 18일

TIL

목록 보기
76/100

🧩 HttpMessageConverter 구조

  • HttpMessageConverter를 주로 사용하는 어노테이션: @RequestBody, @ResponseBody가 존재함
  • 컨트롤러 앞뒤에서 요청 바디 ↔ 자바 객체, 자바 객체 ↔ 응답 바디 변환이 필요할 때 동작
  • 이때 직접 호출하기보다는 스프링 MVC의 두 축이 사용됨
    • 요청 쪽: ArgumentResolver(핸들러 메서드 파라미터 바인딩 담당)
    • 응답 쪽: ReturnValueHandler(핸들러 메서드 반환값 처리 담당)

🧭 RequestMappingHandlerAdapter 구조

  • @RequestMapping을 처리하는 핵심 어댑터이며, 내부적으로
    • 요청 처리 단계에서 ArgumentResolver를 통해 필요한 파라미터를 만들고,
    • 응답 처리 단계에서 ReturnValueHandler를 통해 반환값을 가공함
  • 이 두 단계에서 공통으로 HttpMessageConverter를 사용하여 메시지 바디 변환이 이루어짐

🔁 HttpMessageConverter (요청/응답에서의 역할)

  • 요청 시: ArgumentResolver메시지 바디 → 자바 객체 변환을 위해 사용
  • 응답 시: ReturnValueHandler자바 객체 → 메시지 바디 변환을 위해 사용

→ 즉, HttpMessageConverter 자체가 파라미터/리턴을 직접 처리하는 것은 아니고,
두 처리기(Resolver/Handler)가 필요할 때 호출하여 변환을 수행

🧑‍💻 대표적인 ArgumentResolver / ReturnValueHandler

1) 🧰 RequestResponseBodyMethodProcessor

  • 대상: @RequestBody, @ResponseBody
  • 특성:
    • HandlerMethodArgumentResolver 상속@RequestBody 파라미터 처리
    • HandlerMethodReturnValueHandler 상속@ResponseBody 반환 처리
      ⇒ 두 가지를 모두 처리하기 때문에 둘 다 상속

2) ✉️ HttpEntityMethodProcessor

  • 대상: HttpEntity<?> (및 이를 상속한 RequestEntity<?>, ResponseEntity<?>)
  • 특성:
    • HandlerMethodArgumentResolver 상속 (요청 본문 + 헤더를 HttpEntity로)
    • HandlerMethodReturnValueHandler 상속 (반환값을 ResponseEntity 등으로)
  • 주요 메서드:
    • supportsParameter(...) → 파라미터 타입이 HttpEntity<?> 혹은 그 하위 타입인지 확인
    • resolveArgument(...) → 실제로 파라미터 객체를 생성
      내부에서 readWithMessageConverters(webRequest, parameter, paramType)를 호출하여 HttpMessageConverter로 요청 바디를 읽어 객체로 변환

🔄 요청과 응답 (흐름 정리)

  • ArgumentResolverHttpMessageConverter는 다름
  • Resolver/HandlerConverter를 사용

1) HTTP 요청

  • @RequestBody를 처리하는 ArgumentResolver 존재
  • HttpEntity를 처리하는 ArgumentResolver 존재
  • 다양한 ArgumentResolver들이 필요 시
    HttpMessageConverter를 호출해 요청 바디 → 자바 객체로 변환

2) HTTP 응답

  • @ResponseBody를 처리하는 ReturnValueHandler 존재
  • HttpEntity를 처리하는 ReturnValueHandler 존재
  • 다양한 ReturnValueHandler들이 필요 시
    HttpMessageConverter를 호출해 자바 객체 → 응답 바디로 변환

🛠️ WebMvcConfigurer (확장 포인트)

  • 스프링 MVC 설정을 사용자 정의할 수 있는 인터페이스
  • 구현체를 스프링 빈으로 등록하여 설정을 확장/커스터마이징함

📚 주요 인터페이스(스프링이 기본 구현 제공, 개발자는 "잘 사용"하면 됨)

  • HandlerMethodArgumentResolver
  • HandlerMethodReturnValueHandler
  • HttpMessageConverter

⚡ 핵심 확장 메서드

  • addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers)
    사용자 정의 ArgumentResolver 추가
  • addReturnValueHandlers(List<HandlerMethodReturnValueHandler> handlers)
    사용자 정의 ReturnValueHandler 추가
  • extendMessageConverters(List<HttpMessageConverter<?>> converters)
    기존 MessageConverter 리스트에 항목 추가/수정 (기본 설정을 유지하면서 확장할 때 사용)

⚙️ @Configuration (스프링 빈 등록과의 관계)

  • @Configuration@Component를 포함
  • 따라서 @Configuration이 붙은 설정 클래스는 컴포넌트 스캔 대상이 되어
    스프링 빈으로 등록됨
    (즉, WebMvcConfigurer 구현체를 이 안에서 선언하면 설정이 적용됨)

🧠 요약 정리

구분설명관련 클래스 / 메서드
HttpMessageConverterHTTP 메시지 바디 ↔ 객체 변환 담당HttpMessageConverter<?>
요청(Request)ArgumentResolver가 필요할 때 Converter 호출 → 바디 → 객체 변환RequestResponseBodyMethodProcessor, HttpEntityMethodProcessor.resolveArgument()
응답(Response)ReturnValueHandler가 필요할 때 Converter 호출 → 객체 → 바디 변환RequestResponseBodyMethodProcessor, HttpEntityMethodProcessor
주요 처리기- RequestResponseBodyMethodProcessor@RequestBody, @ResponseBody
- HttpEntityMethodProcessorHttpEntity, RequestEntity, ResponseEntity
두 클래스 모두 HandlerMethodArgumentResolver + HandlerMethodReturnValueHandler 상속
확장 포인트WebMvcConfigurer 인터페이스를 구현하여 확장
⮑ ArgumentResolver 추가addArgumentResolvers(List<HandlerMethodArgumentResolver>)사용자 정의 파라미터 바인딩
⮑ ReturnValueHandler 추가addReturnValueHandlers(List<HandlerMethodReturnValueHandler>)사용자 정의 반환 처리
⮑ MessageConverter 확장extendMessageConverters(List<HttpMessageConverter<?>>)기존 Converter 유지 + 추가 확장
@Configuration@Component 포함 → 스프링 빈 등록되어 설정 적용됨

0개의 댓글