Spring
[Spring] HttpMessageConverter 정리
DevHyo
2022. 2. 1. 18:10
HttpMessageConverter를 사용하면, JSON 데이터를 Http Message Body에서 직접 읽거나 쓰는 경우에 편리하다.
@ResponseBody를 사용하는 경우
- ViewResolver 대신에 HttpMessageConverter가 동작된다.
- 기본 문자 처리의 경우, StringHttpMessageConverter를 사용한다.
- 기본 객체 처리의 경우, MappingJackson2 HttpMessageConverter를 사용한다.
- byte [] 처리 및 기타 여러 가지의 HttpMessageConverter가 기본으로 등록되어 있다.
HTTP 요청, 응답에 둘 다 사용
- 요청의 경우, 메시지를 읽어서 객체로 바꾼 다음 컨트롤러에 파라미터로 넘겨주는 역할은 한다.
- 응답의 경우, 컨트롤러에서 리턴 값을 가지고 Http 응답 메시지로 넣는 역할을 한다.
- HttpMessageConverter는 인터페이스이며, canRead(), canWrite(), read(), write() 메서드가 존재한다.
- canRead()와 canWrite()는 메시지 컨버터가 해당 클래스, 미디어 타입을 지원하는지 체크한다.
- read()와 write()는 메시지 컨버터를 통해서 메시지를 읽거나 쓰는 기능이다.
Spring Boot의 기본 Message Converter (일부 생략)
- Message Converter 간의 우선순위가 있다.
- 0 : ByteArrayHttpMessageConverter
- 1 : StringHttpMessageConverter
- 2: MappingJackson2HttpMessageConverter
ByteArrayHttpMessageConverter
- byte [] 데이터 처리
- 클래스 타입은 byte [], 미디어 타입은 */*이다. (미디어 타입의 경우, 아무거나 다 됨)
- 요청 및 응답 예시
- @RequestBody byte [] data
- @ResponseBody return byte []의 경우, 쓰기 미디어 타입은 application/octet-stream으로 반환된다.
StringHttpMessageConverter
- String 문자의 데이터 처리
- 클래스 타입은 String, 미디어 타입은 */*이다. (미디어 타입의 경우, 아무거나 다 됨)
- 요청 및 응답 예시
- @RequestBody String data
- @ResponseBody return "ok"의 경우, 쓰기 미디어 타입은 text/plain으로 반환된다.
MappingJackson2HttpMessageConverter
- 클래스 타입은 객체 또는 HashMap, 미디어 타입은 application/json이다.
- 요청 및 응답 예시
- @RequestBody RequestMyData data
- @ResponseBody return data의 경우, 쓰기 미디어 타입은 application/json으로 반환된다.
HTTP 요청 데이터 읽는 과정
- @RequestBody 또는 HttpEntity 파라미터를 사용한다.
- 메시지 컨버터가 메시지를 읽을 수 있는지 확인하기 위해서 canRead()를 호출한다.
- 대상 클래스 타입을 지원하는가? ex) byte[], String, 객체 또는 HashMap
- HTTP 요청의 Content-Type 미디어 타입을 지원하는가? ex) text/plain, application/json, */*
- canRead()에서 조건 1과 2를 만족하면, read()를 호출해서 객체를 반환한다.
HTTP 응답 데이터 생성 과정
- @ReponseBody 또는 HttpEntity로 값을 변환한다.
- 메시지 컨버터가 메시지를 쓸 수 있는지 확인하기 위해서 canWrite()를 호출한다.
- 리턴 대상 클래스 타입을 지원하는가?
- HTTP 요청의 Accept 미디어 타입을 지원하는가?
- canWrite()에서 조건 1과 2를 만족하면, write()를 호출해서 HTTP 응답 메시지 바디에 데이터를 생성한다.
참고
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1