아무나개발하자

HTTP 메시지 컨버터 본문

Spring

HTTP 메시지 컨버터

개발천재나천재 2022. 7. 14. 15:45

컨트롤러가 뷰템플릿으로 HTML을 생성해서 응답하는 것이 아니라, HTTP API처럼 JSON이나, 텍스트를 HTTP메시지 바디에서 직접 읽거나 쓰는경우 HTTP 메시지 컨버터를 사용한다. 그럼 자세하게 HTTP메시지 컨버터에 대해 소개하겠다.

 

우선 컨트롤러에서 파라미터에 @RequestBody , HttpEntity(RequestEntity)가 사용되면, HTTP요청 정보를 메시지 컨버터를 사용하여 우리가 필요한 정보로 변환해 준다. return 값으로 @ResponseBody , HttpEntity(ResponseEntity)가 사용되면, HTTP 바디에 우리가 반환한 값을 직접 써서 반환해준다.

 

org.springframework.http.converter.HttpMessageConverter

public interface HttpMessageConverter<T> {

	boolean canRead(Class<?> clazz, @Nullable MediaType mediaType);

	
	boolean canWrite(Class<?> clazz, @Nullable MediaType mediaType);

	
	List<MediaType> getSupportedMediaTypes();

	
	default List<MediaType> getSupportedMediaTypes(Class<?> clazz) {
		return (canRead(clazz, null) || canWrite(clazz, null) ?
				getSupportedMediaTypes() : Collections.emptyList());
	}

	
	T read(Class<? extends T> clazz, HttpInputMessage inputMessage)
			throws IOException, HttpMessageNotReadableException;

	
	void write(T t, @Nullable MediaType contentType, HttpOutputMessage outputMessage)
			throws IOException, HttpMessageNotWritableException;

}

HTTP 메시지 컨버터는 HTTP 요청, HTTP 응답 둘 다 사용되고, canRead(), canWrite()를 통해 메시지 컨버터가 해당 클래스나 미디어 타입을 지원하는지 체크하고 read(), write()를 통해 메시지를 쓰거나 읽게된다.

 

스프링 부트 기본 메시지 컨버터

 

HttpMessageConverter클래스를 구현한 많은 메시지 컨버터 클래스가 있지만 우선 가장많이 사용되는 3개 클래스를 소개하겠다.

 

0 = ByteArrayHttpMessageConverter

- ByteArrayHttpMessageConverter : byte[] 데이터를 처리한다.
- 클래스 타입: byte[] , 미디어타입: */* ,
- 요청 예) @RequestBody byte[] data
- 응답 예) @ResponseBody return byte[] 쓰기 미디어타입 application/octet-stream

 

1 = StringHttpMessageConverter

- StringHttpMessageConverter : String 문자로 데이터를 처리한다.
- 클래스 타입: String , 미디어타입: */*
- 요청 예) @RequestBody String data
- 응답 예) @ResponseBody return "ok" 쓰기 미디어타입 text/plain

 

2 = MappingJackson2HttpMessageConverter

- MappingJackson2HttpMessageConverter : application/json
- 클래스 타입: 객체 또는 HashMap , 미디어타입 application/json 관련
- 요청 예) @RequestBody HelloData data
- 응답 예) @ResponseBody return helloData 쓰기 미디어타입 application/json 관련

 

HTTP 요청과 응답이 왔을때 예시

 

HTTP 요청 (read())

HTTP 요청이 오고, 컨트롤러에서 @RequestBody , HttpEntity 파라미터를 사용하면 메시지 컨버터가 메시지를 읽을 수 있는지 확인 하기 위해 canRead() 를 호출한다. 대상 클래스 ( byte[] , String , 객체)가 무엇인지 확인하고 Content-Type 미디어 타입( text/plain , application/json , */*)을 확인 한 후 해당 조건을 만족 시키는 클래스의 read()를 호출해서 객체를 생성하고 반환한다.

 

HTTP 응답(write())

컨트롤러에서 @ResponseBody , HttpEntity 로 값이 반환되면, 메시지 컨버터가 메시지를 쓸 수 있는지 확인하기 위해 canWrite() 를 호출한다. return의 대상 클래스 ( byte[] , String , HelloData )가 무엇인지 확인하고, HTTP 요청의 Accept 미디어 타입(text/plain , application/json , */*)을 확인 한 후 해당 조건을 만족시키는 클래스의 write() 를 호출해서 HTTP 응답 메시지 바디에 데이터를 생성한다.

 

참고자료 : https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard

'Spring' 카테고리의 다른 글

스프링 MVC - 웹 페이지 만들기1  (0) 2022.07.21
HTTP 메시지 컨버터2  (0) 2022.07.16
프론트 컨트롤러 패턴 소개4  (0) 2022.07.10
프론트 컨트롤러 패턴 소개3  (0) 2022.07.09
프론트 컨트롤러 패턴 소개2  (0) 2022.07.08