티스토리 뷰
(참고: Spring Boot를 기준으로 작성된 글입니다)
이전 글에서 클라이언트와 서버가 데이터를 주고받을 때 Handler Adapterd와 Handler의 사이의
Argument Resolver와 ReturnValue Handler가 어떻게 작동하는지 살펴보았다
HTTPMessageConverters
Argument Resolver와 Return Value Handler만 있다고 객체를 생성하여 전달하고, 반환 값을 반환할 수는 없다. 이 값들의 타입들을 확인하여 알맞은 데이터를 생성하고 반환하는 절차가 필요한데 이를 수행하는 것이 HTTPMessageConverters이다
즉 서버가 어떤 요청을 받았는지, 어떤 응답을 보내는지에 따라서 다른 컨버터가 적용되는 것이다
사실 HTTPMessageConverters는 스프링 프레임워크가 제공하는 인터페이스이다
이는 요청과 응답 둘 모두 사용되는데 실제 코드는 아래와 같다
//HttpMessageConverter 인터페이스의 실제 코드
public interface HttpMessageConverter<T> {
boolean canRead(Class<?> clazz, @Nullable MediaType mediaType);
boolean canWrite(Class<?> clazz, @Nullable MediaType mediaType);
List<MediaType> getSupportedMediaTypes();
T read(Class<? extends T> clazz, HttpInputMessage inputMessage)
throws IOException, HttpMessageNotReadableException;
void write(T t, @Nullable MediaType contentType, HttpOutputMessage
outputMessage) throws IOException, HttpMessageNotWritableException;
}
메시지 컨버터에 요청된 값들은 위의 메서드들을 거치며 해당 값이
어떠한 클래스타입과 미디어 타입을 가지고 있는 체크 하여 메시지를 읽거나 쓰게 된다
//canRead , canWrite : 해당 클래스 타입과 미디어 타입을 지원하는지 체크
//read, write : 메시지를 읽고 쓰는 기능
이번글에서는 주로 사용되는 3가지의 컨버터를 기준으로 살펴보겠다, 해당 값들은 메시지 컨버터가 아래와 같은 우선순위로 클래스 타입과 미디어 타입을 체크하여 어떤 컨버터를 사용할지 결정한다 (각 값들의 타입을 맞춰보고 맞지 않으면 다음 우선순위로 넘어가는 것이다)
/**
* 요청 시
*/
0 = ByteArrayHttpMessageConverter // 클래스 타입 : byte[] , 미디어 타입 : */*
//요청 예시) @RequestBody byte[] data
1 = StringHttpMessageConverter // 클래스 타입 : String , 미디어 타입 : */*
//요청 예시) @ReuqestBody String data
2 = MappingJackson2HttpMessageConverter // 클래스 타입 : 객체 또는 HashMap , 미디어 타입 : application/json
//요청 예시) @RequestBody Data(직접 만든 객체) data
/**
* 응답 시
*/
0 = ByteArrayHttpMessageConverter // 미디어 타입 : application/octet-stream
//응답 예시) @ResponseBody return byte[]
1 = StringHttpMessageConverter // 미디어 타입 : text/plain
//응답 예시) @ResponseBody return "ok";
2 = MappingJackson2HttpMessageConverter // 미디어 타입 : application/json
//응답 예시) @ResponseBody return data
예시를 통해 해당 메시지 컨버터가 어떻게 사용되는지 살펴보자
• StringMesseageConverter가 사용되는 경우
content-type: application/json
@RequestMapping
void example(@RequestBody String data) {}
1. 클래스 타입 체크 : String으로 왔으니 0순위인 byte는 패스하고 String메시지 컨버터로 넘어감, String이 맞으니 해당 컨버터를 사용
2. 미디어 타입 체크 : 미디어 타입을 체크, application/json으로 왔으나, */*(전부)가 디폴트로 설정되어 있으니 해당 컨버터 사용
• Json메시지 컨버터가 사용되는 경우
content-type: application/json
@RequestMappin
void exmaple(@RequestBody Data(직접 만든 객체) data) {}
1. 클래스 타입 체크 : 객체로 받으니 byte와 String을 건너뛰고 Json컨버터 사용
2. 미디어 타입 체크 : 미디어 타입도 json이기 때문에 Json컨버터 사용
• 아무 컨버터도 사용되지 않는 경우
content-type: text/html
@RequestMapping
void example(@RequestBody Data(직접 만든 객체) data) {}
1. 클래스 타입 체크 : 객체로 받으니 byte와 String을 건너뛰고 Json컨버터 사용
2. 미디어 타입 체크 : Json컨버터가 지원하지 않는 text/html이기 때문에 Json 컨버터 사용 불가
3. 에러발생
핵심정리
클라이언트(사용자)와 서버가 데이터를 주고받을 때 메시지 컨버터를 사용하여
해당 데이터의 클래스 타입과 미디어 타입을 체크하여
ArgumentResolver와 ReturnValueHandler가 해당 객체를 생성하고 반환할 수 있게 해 준다
주로 사용되는 메시지 컨버터는 3가지 종류가 있으며
클래스 타입을 기준으로 우선순위대로 스캔하여 알맞은 컨버터를 찾는다
이후 미디어 타입을 한번 더 체크하여 해당 컨버터를 사용한다
개인 학습을 위해 작성되는 글입니다.
제가 잘못 알고 있는 점에 대한 지적 / 더 나은 방향에 대한 댓글을 환영합니다.
참조 링크:
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard
'Spring > Spring MVC' 카테고리의 다른 글
[Spring MVC] HTTP Response (HTTP 응답) (0) | 2021.08.30 |
---|---|
[Spring MVC] HTTP Request Data(HTTP 요청 조회) (0) | 2021.08.30 |
[Spring MVC] Argument Resolver와 ReturnValue Handler (0) | 2021.08.27 |
[Spring MVC] Request Mapping 과 REST API 설계 (0) | 2021.08.24 |
[Spring MVC] @Controller 와 @RestController (0) | 2021.08.24 |
- Total
- Today
- Yesterday
- DTO와 VO의 차이
- http
- jQuery 직접 선택자
- 맨코
- Spring Container
- 제이쿼리 기본 선택자
- maenco
- 제이쿼리 위치탐색선택자
- 쿠키
- 제이쿼리 탐색선택자
- 세션
- @ResponseStatus
- 캐시
- Cache
- DefaultHandlerExceptionResolver
- ResponseStatusExeceptionResolver
- 제이쿼리란
- @ExceptionHandlere
- Spring TypeConverter
- application/x-www-form-urlencoded
- 제이쿼리 직접 선택자
- Session
- Spring MVC
- ExceptionHandlerExceptionResolver
- OOP
- 제이쿼리 인접 관계 선택자
- uri
- cookie
- spring
- Spring API Error
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |