HTTP 메시지 컨버터

무삭이의 개발일지·2023년 8월 4일
0
post-thumbnail

HTTP 메시지 컨버터에 대해 알아보자 :)

🦎 convert
1. [동사] (형태목적시스템 등을) 전환시키다[개조하다]
2. [동사] (형태목적시스템 등이) 전환[개조]되다

convert란 전환시키다, 개조하다란 뜻을 가지고 있는데, 전환, 변환의 느낌을 가지고 있다. 그렇다면 converter의 뜻 바로 변환기, 전환 장치 되시겠다 두둥!!

그렇다면 어떻게 전환,변환을 시킬까?

🌿 스프링 MVC는 HTTP 메시지 컨버터를 적용한다.
HTTP 요청: @RequestBody , HttpEntity(RequestEntity)
HTTP 응답: @ResponseBody , HttpEntity(ResponseEntity)

스프링 부트는 기본적으로 메시지 컨버터를 등록 해놓는다.
1.ByteArrayHttpMessageConverter : byte[] 데이터를 처리한다.
클래스 타입: byte[] , 미디어타입: * / * ,
요청 예) @RequestBody byte[] data
응답 예) @ResponseBody return byte[] 쓰기 미디어타입: application/octet-stream

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

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

⚔️ 순서대로 해당 메시지 컨버터를 이용해서 찾고 아니라면 다음 순서로 넘어간다.

그렇다면 HTTP 메시지 컨버터는 스프링 MVC 어디 지점에서 사용될까?

👉 모든 비밀은 애노테이션 기반의 컨트롤러, 그러니까 @RequestMapping 을 처리하는 핸들러 어댑터인 RequestMappingHandlerAdapter (요청 매핑 헨들러 어뎁터)에 있다.

🤔 ArgumentResolver?

  • 생각해보면, 애노테이션 기반의 컨트롤러는 매우 다양한 파라미터를 사용할 수 있다. 어째서..? HttpServletRequest, Model은 물론, @RequestParam, @ModelAttribute 같은 애노테이션 그리고 @RequestBody, HttpEntity 같은 HTTP 메시지를 처리하는 부분까지 매우 큰 유연함을 보여주는데, 이렇게 유연하게 다양한 파라미터를 처리할 수 있는 이유는 바로 ArgumentResolver 덕분이다.!!!
    애노테이션 기반 컨트롤러를 처리하는 RequestMappingHandlerAdapter 는 바로 이 ArgumentResolver 를 호출해서 컨트롤러(핸들러)가 필요로 하는 다양한 파라미터의 값(객체)을 생성한다. 그리고 이렇게 파리미터의 값이 모두 준비되면 컨트롤러를 호출하면서 값을 넘겨준다.

ArgumentResolver는 응답 값도 변환해서 처리해줄까?

응답시에는 다른 친구가 처리하는데, ReturnValueHandler. HandlerMethodReturnValueHandler 를 줄여서 ReturnValueHandler 라 부른다. 응답 값을 변환하고 처리하는 역할을 한다.
컨트롤러에서 String으로 뷰 이름을 반환해도, 동작하는 이유가 바로 ReturnValueHandler 덕분이다.

🎯 결국 HTTP 메시지 컨버터는 요청과 응답 모두에서 사용한다.
요청의 경우 @RequestBody 를 처리하는 ArgumentResolver 가 있고, HttpEntity 를 처리하는 ArgumentResolver 가 있다. 이 ArgumentResolver 들이 HTTP 메시지 컨버터를 사용해서 필요한 객체를 생성하는 것이다.
응답의 경우 @ResponseBody 와 HttpEntity 를 처리하는 ReturnValueHandler 가 있다. 그리고 여기에서 HTTP 메시지 컨버터를 호출해서 응답 결과를 만든다.

profile
No. Try not. Do or Do not. There is no try.

1개의 댓글

comment-user-thumbnail
2023년 8월 4일

감사합니다. 이런 정보를 나눠주셔서 좋아요.

답글 달기