HttpMessageConverter
View를 응답하는 것이 아닌, Rest API(HTTP API)로 JSON, TEXT, XML 등의 데이터를 응답 Message Body에 직접 입력하는 경우 HttppMessageConverter를 사용한다.
💡 참고
1. SSR → @Controller + View Template 를 조합해 서버측에서 UI를 동적으로 만든다.
2. CSR → @RestController + Data 를 조합해 클라이언트 측에서 화면을 동적으로 그린다.
3. 실제로 두가지 기술이 함께 사용되는 경우가 많다.
HttpMessageConverter 동작 순서
HttpMessageConverter의 동작 순서는 위의 그림과 같다.
HTTP 응답 메시지 Body에 데이터를 직접 입력 후 반환한다.
@ResponseBody 뿐만 아니라 요청의 Accept Header + Controller 메서드의 반환 타입으로 어떤 데이터가 응답될 지 결정이 된다.
기존의 MVC에서 처럼 ViewResolver가 아닌 HttpMessageConverter가 동작한다.
HttpMessageConverter가 적용되는 경우
HTTP 요청 : @RequestBody, HttpEntity<>, RequestEntity<> (HttpEntity<>를 상속받아 만들어진 객체이다.)
HTTP 응답 : @ResponseBody, HttpEntity<>, ResponseEntity<>
응답 뿐만아니라 요청에서도 HttpMessageConverter가 동작한다.
💡참고
@RestController = @Controller + @ResponseBody
HttpMessageConverter 내부 구조
canRead( ), canWrite( ) 메서드로 메시지 컨버터의 Class, MediaType 지원여부를 체크한다.
read( ), write( ) 메서드로 HttpMessage 를 읽고 쓴다.
메시지 컨버터의 우선 순위
Spring은 다양한 HttpMessageConverter를 제공하고 있고 우선순위가 있다. 대상 Class와 MediaType을 체크해서 어떤 Converter를 사용할 지 결정한다.
대표적인 HttpMessageConverter
1. ByteArrayHttpMessageConverter
- byte[ ] 데이터를 처리한다.
- 대상 : byte[ ]
- MediaType : */*
- 반환 : application/octet-stream
@Slf4j
@RestController // @Controller + @ResponseBody
public class MessageConverterController {
// 요청 헤더 -> content-type: */*
@PostMapping("/byte-array")
// byte[] -> produces = "application/octext-stream"
public byte[] byteArray(@RequestBody byte[] data) {
log.info("byte-array logic");
return data; // response
}
}
2. StringHttpMessageConverter
- String 데이터를 처리한다.
- 대상 : String
- MediaType : */*
- 반환 : text/plain
// 요청 헤더 -> content-type: text/plain
@PostMapping("/string")
// String -> produces = "text/plain"
public String string(@RequestBody String data) {
log.info("string logic");
return data;
}
3. MappingJackson2HttpMessageConverter
- JSON 데이터를 처리한다.
- 대상 : Objcet , HashMap
- MediaType : application/json
- 반환 : application/json
// 요청 헤더 content-type: application/json
@PostMapping("/json")
// Data -> produces = "application/json"
public Data json(@RequestBody Data data) {
log.info("json logic");
return data;
}
4. 기타
이외에도 기본적으로 제공되는 다양한 MessageConverter가 존재한다.
대부분의 경우 위 세가지로 해결이 된다.
정리
위에 1번(ByteArrayHttpMessageConverter)부터 순서대로 canRead( )또는 canWrite( )가 호출되고 true가 반환되면 read( )또는 write( )가 호출된다.
'스프링 프레임워크' 카테고리의 다른 글
WebMvcConfigure (0) | 2024.11.27 |
---|---|
ArgumentResolver (1) | 2024.11.27 |
Spring의 MVC의 구조 (0) | 2024.11.27 |
프론트 컨트롤러 패턴와 어댑터 패턴 (0) | 2024.11.27 |
MVC 패턴 (0) | 2024.11.27 |