HttpMessageConverter
- View로 응답하는 것이 아닌 Rest API로 JSON, Text, Xml 등의 데이터를 직접 응답 Message Body에 입력하는 경우 HttpMessageConverter를 사용한다.
- 동작 순서
대표적인 HttpMessageConverter
- ByteArrayHttpMessageConverter
- byte[] 데이터를 처리한다.
- 대상 :
byte[]- MediaType :
*/*- 반환 :
application/octet-stram
- StringHttpMessageConverter
- String 데이터를 처리한다.
- 대상 :
String- MediaType :
*/*- 반환 :
text/plain
- MappingJackson2HttpMessageConverter
- JSON 데이터를 처리한다.
- 대상 :
Object,HashMap- MediaType :
application/json- 반환 :
application/json
- 우선순위
- ByteArray ➡ String ➡ JSON ➡ 기타
- 대부분 위의 3개로 해결됨
RequestMappingHandlerAdapter
- HTTP 요청을 컨트롤러에 매핑하고 실행하는 핵심 구성요소
- 클라이언트 요청을 적절한 컨트롤러와 연결 -> 메서드를 호출해 결과 반환
@RequestMapping을 처리하는 Handler Adapter의 구현체이다.
Argument Resolver
- 컨트롤러 메서드의 파라미터를 자동으로 바인딩하는 역할 (인터페이스)
- 요청이 컨트롤러 메서드에 전달될 때 각 파라미터를 적절한 객체로 변환시켜 주입
- ex)
@PathVariable,@RequestBody등등- 사용 가능한 파라미터 공식 문서 : https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-controller/ann-methods/arguments.html
ReturnValueHandler
- 컨트롤러 메서드가 반환하는 값을 HTTP 응답에 맞게 변환하는 역할 (인터페이스)
@ResponseBody,HttpEntity<>,ModelAndView가 있으면 해당 응답에 필요한 값으로 반환
RequestMappingHandlerAdapter 구조
- 요청 시 : Argument Resolver가 HttpMessageConverter를 사용
- 응답 시 : ReturnValueHandler가 HttpMessageConverter를 사용
WebMvcConfigurer
- Spring MVC의 설정을 사용자 정의할 수 있도록 만든 인터페이스
- 주요 메서드
void addArgumentsResolvers()void addReturnValueHandlers()void extendMessageConverters()
- 위를 사용하는 주요 인터페이스
HandlerMethodArgumentResolverHandlerMethodReturnValueHandlerHttpMessageConverter
ConversionService
- Converter를 모아서 편리하게 관리하고 사용할 수 있게 해주는 기능
- 다양한 Converter 공식 문서 : https://docs.spring.io/spring-framework/reference/core/validation/convert.html
- DefaultConversionService
- Spring의 표준
ConversionService로 기본으로 제공된Converter와 확장 가능성을 통해 다양한 타입 변환을 유연하게 처리할 수 있도록 지원
Formatter
- 주로 커스텀 포맷을 적용해 데이터 변환을 처리할 때 사용됨
- Converter보다 조금 더 세부적인 기능이라고 생각하면 됨
- 공식 문서 : https://docs.spring.io/spring-framework/reference/core/validation/format.html
FormattingConversionService
ConversionService와Formatter를 결합한 구현체- 타입 변환과 포맷팅이 필요한 모든 작업을 한 곳에서 수행할 수 있도록 설계
- Spring Field Formatter 공식 문서 : https://docs.spring.io/spring-framework/reference/core/validation/format.html#format-CustomFormatAnnotations