들어가며
일전의 @ResponseBody 어노테이션에 대해서 정리한 포스팅이 있다.
https://data-study-clip.tistory.com/189?category=1034056
@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 관련
위와 같은 우선순위가 존재하고 대상 클래스 타입과 미디어 타입 둘을 체크해서 사용여부를 결정한다.
만약 만족하지 않으면 다음 메시지 컨버터로 우선순위가 넘어간다.
'Spring' 카테고리의 다른 글
Spring에서 Bean이 관리되는 방법 (0) | 2023.09.02 |
---|---|
Filter와 Interceptor의 차이점 (비교 및 정리) (0) | 2023.09.01 |
Springboot + react 조합의 프로젝트 생성하기 (0) | 2022.08.27 |
Spring - @ResponseBody 사용원리 (0) | 2022.06.23 |
Spring - Dispathcher-Servlet 개념 (0) | 2022.05.24 |