spring - MessageConverter 인터페이스의 구현체 종류 정리

들어가며

  일전의 @ResponseBody 어노테이션에 대해서 정리한 포스팅이 있다.

https://data-study-clip.tistory.com/189?category=1034056 

 

Spring - @ResponseBody 사용원리

클라이언트에서 localhost:8080/hi-spring url로 요청이 들어왔다고 치자 그럼 톰켓서버에서 해당 url 요청이 들어왔다고 Spring Container에다가 던져준다. 스프링컨테이너에 있는 Controller에서 매핑되는게

data-study-clip.tistory.com

 

@ResponseBody라는 어노테이션이 없으면 ViewResolver에게 던져서 템플릿엔진으로 처리하게 되고

@ResponseBody 어노테이션이 붙어있으면 데이터 그대로 내려주게된다는 내용이 있는데

 

신기하게도 Spring에서 DTO나 VO 객체들을 내려주면 알아서 json 형태로 내려준다는 것이다.

위 글에서도 적었다시피

 

HttpMessageConverter라는  녀석안에 있는 녀석들 중에

객체를 내려줄 때는 MappingJackson2HttpMessageConverter가 동작하고

그냥 문자를 내려주는 경우에는 StringHttpMessageConverter가 동작한다고 설명했다.

 

즉 HttpMessageConverter라는 녀석은 인터페이스이다.

이 인터페이스의 기능을 좀 더 자세히 정리해보고 

또 상속받아서 쓸 수 있는 구현체들의 종류에 대해서 정리해보고자 한다.

 

 

HttpMessageConverter란

 요청의 경우, 메시지를 읽어서 객체로 바꾼 다음 컨트롤러에 파라미터로 넘겨주는 역할을 한다.
응답의 경우, 컨트롤러에서 리턴 값을 가지고 Http 응답 메시지로 넣는 역할을 한다.


HttpMessageConverter는 인터페이스이며, canRead(), canWrite(), read(), write() 메서드가 존재한다.
canRead()와 canWrite()는 메시지 컨버터가 해당 클래스, 미디어 타입을 지원하는지 체크한다.
read()와 write()는 메시지 컨버터를 통해서 메시지를 읽거나 쓰는 기능이다.


Message Converter 간의 우선순위가 있다.


0순위 : ByteArrayHttpMessageConverter
1순위 : StringHttpMessageConverter
2순위 : MappingJackson2HttpMessageConverter


스프링 MVC는 다음의 경우에 HTTP 메시지 컨버터를 적용하는데
HTTP 요청 @RequestBody , HttpEntity(RequestEntity) 
HTTP 응답 @ResponseBody , HttpEntity(ResponseEntity) 
메시지 컨버터의 우선순위에 따라 적용된다

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

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

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


위와 같은 우선순위가 존재하고 대상 클래스 타입과 미디어 타입 둘을 체크해서 사용여부를 결정한다.  

만약 만족하지 않으면 다음 메시지 컨버터로 우선순위가 넘어간다.