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

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

ArgumentResolver가 메시지 바디 → 자바 객체 변환을 위해 사용ReturnValueHandler가 자바 객체 → 메시지 바디 변환을 위해 사용→ 즉, HttpMessageConverter 자체가 파라미터/리턴을 직접 처리하는 것은 아니고,
두 처리기(Resolver/Handler)가 필요할 때 호출하여 변환을 수행
🧑💻 대표적인 ArgumentResolver / ReturnValueHandler
1) 🧰 RequestResponseBodyMethodProcessor
@RequestBody, @ResponseBodyHandlerMethodArgumentResolver 상속 → @RequestBody 파라미터 처리HandlerMethodReturnValueHandler 상속 → @ResponseBody 반환 처리2) ✉️ HttpEntityMethodProcessor
HttpEntity<?> (및 이를 상속한 RequestEntity<?>, ResponseEntity<?>)HandlerMethodArgumentResolver 상속 (요청 본문 + 헤더를 HttpEntity로)HandlerMethodReturnValueHandler 상속 (반환값을 ResponseEntity 등으로)supportsParameter(...) → 파라미터 타입이 HttpEntity<?> 혹은 그 하위 타입인지 확인resolveArgument(...) → 실제로 파라미터 객체를 생성readWithMessageConverters(webRequest, parameter, paramType)를 호출하여 HttpMessageConverter로 요청 바디를 읽어 객체로 변환🔄 요청과 응답 (흐름 정리)
ArgumentResolver와HttpMessageConverter는 다름Resolver/Handler가 Converter를 사용함
1) HTTP 요청
@RequestBody를 처리하는 ArgumentResolver 존재HttpEntity를 처리하는 ArgumentResolver 존재ArgumentResolver들이 필요 시HttpMessageConverter를 호출해 요청 바디 → 자바 객체로 변환2) HTTP 응답
@ResponseBody를 처리하는 ReturnValueHandler 존재HttpEntity를 처리하는 ReturnValueHandler 존재ReturnValueHandler들이 필요 시HttpMessageConverter를 호출해 자바 객체 → 응답 바디로 변환🛠️ WebMvcConfigurer (확장 포인트)
- 스프링 MVC 설정을 사용자 정의할 수 있는 인터페이스
- 구현체를 스프링 빈으로 등록하여 설정을 확장/커스터마이징함
📚 주요 인터페이스(스프링이 기본 구현 제공, 개발자는 "잘 사용"하면 됨)
HandlerMethodArgumentResolverHandlerMethodReturnValueHandlerHttpMessageConverter⚡ 핵심 확장 메서드
addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers)addReturnValueHandlers(List<HandlerMethodReturnValueHandler> handlers)extendMessageConverters(List<HttpMessageConverter<?>> converters)⚙️ @Configuration (스프링 빈 등록과의 관계)
@Configuration은 @Component를 포함@Configuration이 붙은 설정 클래스는 컴포넌트 스캔 대상이 되어WebMvcConfigurer 구현체를 이 안에서 선언하면 설정이 적용됨)🧠 요약 정리
| 구분 | 설명 | 관련 클래스 / 메서드 |
|---|---|---|
| HttpMessageConverter | HTTP 메시지 바디 ↔ 객체 변환 담당 | HttpMessageConverter<?> |
| 요청(Request) | ArgumentResolver가 필요할 때 Converter 호출 → 바디 → 객체 변환 | RequestResponseBodyMethodProcessor, HttpEntityMethodProcessor.resolveArgument() |
| 응답(Response) | ReturnValueHandler가 필요할 때 Converter 호출 → 객체 → 바디 변환 | RequestResponseBodyMethodProcessor, HttpEntityMethodProcessor |
| 주요 처리기 | - RequestResponseBodyMethodProcessor → @RequestBody, @ResponseBody - HttpEntityMethodProcessor → HttpEntity, RequestEntity, ResponseEntity | 두 클래스 모두 HandlerMethodArgumentResolver + HandlerMethodReturnValueHandler 상속 |
| 확장 포인트 | WebMvcConfigurer 인터페이스를 구현하여 확장 | |
| ⮑ ArgumentResolver 추가 | addArgumentResolvers(List<HandlerMethodArgumentResolver>) | 사용자 정의 파라미터 바인딩 |
| ⮑ ReturnValueHandler 추가 | addReturnValueHandlers(List<HandlerMethodReturnValueHandler>) | 사용자 정의 반환 처리 |
| ⮑ MessageConverter 확장 | extendMessageConverters(List<HttpMessageConverter<?>>) | 기존 Converter 유지 + 추가 확장 |
| @Configuration | @Component 포함 → 스프링 빈 등록되어 설정 적용됨 |