HTTP 메시지를 spring에서 사용하기 쉽게 만들어 주는 MessageConverter

신창호·2022년 7월 30일
0
post-thumbnail

HTTP 메시지 컨버터

  • HTTP 요청을 모델에 바인딩하고 클라이언트에 보낼 HTTP 응답을 만들기 위해 뷰를 사용했던 방식과는 달리,
    HTTP 메시지 컨버터는 HTTP 요청 본문과 HTTP 응답 본문을 통째로 메세지로 다루는 방식이다.
  • 주로 XML이나 JSON을 이용한 AJAX기능이나 웹 서비스를 개발할 때 사용된다.
  • 스프링의 @RequestBody@ResponseBody를 통해 HTTP 메시지 컨버터를 자동 사용할 수 있다.
    • 혹은 HttpEntity(RequestEntity), HttpEntity(ResponseEntity)에서도 HTTP 메시지 컨버터가 적용된다.
    • 요청에 Body가 없는 경우에는 @RequestBody를 사용할 수 없고, 이 경우엔 @RequestParam이나 @ModelAttribute를 사용해야 한다.

메시지 컨버터 자동생성

  • 이렇게 사용되는 메시지 컨버터는 Springframeworboot를 사용하면 자동 생성된다.
    • BackgroundPreinitializer클래스는 이름그대로 미리초기화되는걸 관리하는 클래스인데, 내부적으로 MessageConverter를 생성하여 실행 시키는 것을 알 수 있다.

  • 그리고 AllEncompassingFormHttpMessageConverter() HttpMessageConverter를 생성해주는 이 생성자를 따라 들어 가면
    • xml과 Json관련된 HttpMessage들을 Mapping 시켜주는 컨버터가 생성된다는 것을 알 수 있다.
    • Jsonmodel로 매핑해주는 MappingJackson2HttpMessageConverter를 만들어 주는게 보인다.

그럼 나머지 메시지컨버터는 어딨을까?

  • AllEncompassingFormHttpMessageConverter를 다시 보면, FormHttpMessageConverter를 상속하고 있는 것을 알 수 있다.
  • 그래서 FormHttpMessageConverter를 확인해보면 HttpMessageConverter를 List로 가지고 있다.
  • 우선순위는 List에 추가된 순서대로 탐색을 하기에, 추가된 순서를 따른다.
    • ByteArrayHttpMessageConverter
    • StringHttpMessageConverter
    • SourceHttpMessageConvreter

자동생성된 메시지 컨버터 종류

  1. ByteArrayHttpMessageConverter : byte[] 데이터를 처리한다
    • 미디어타입은 모든 것을 다 지원한다.
    • 즉,요청 파라미터에 @RequestBody byte[] param과 같이 작성하면 모든 요청을 다 byte배열로 받을 수 있다는 말이다.
    • 응답 리턴타입을 byte[]로 했을 경우 Content-Typeapplcation/octet-stream으로 설정되어 전달된다.
    • 파일 및 이미지 다운로드/업로드일때 쓰인다고 한다.
  2. StringHttpMessageConverter : String 문자로 데이터를 처리한다.
    • 미디어타입은 모든 것을 다 지원한다.
    • 요청 파라미터에 사용할 경우 HTTP 본문을 그대로 String으로 가져올 수 있다.
    • 응답 리턴에 사용할 경우 단순 문자열을 그대로 전달해줄 수 있다. Content-Typetext/plain
  3. SourceHttpMessageConvreter
    • 미디어타입은 모든 것을 다 지원한다.
    • Content-Typeapplication/octet-stream를 지원한다. 알려지지않은 파일 타입은 이타입을 사용한다.
    • 브라우저들은 이런 파일들을 다룰 때, 사용자를 위험한 동작으로부터 보호하도록 개별적인 주의를 기울여야 한다.
  4. FormHttpMessageConverter
    • 보이다시피, 지원하는 미디어 타입은 MediaType.APPLICATION_FORM_URLENCODED, MediaType.MULTIPART_FORM_DATA,MediaType.MULTIPART_MIXED이다.
    • 즉, 정의된 폼 데이터를 주고받을 때 사용할 수 있다
  5. MappingJackson2HttpMessageConverter
    • 미디어타입은 MediaType.APPLICATION_JSON만 지원한다.
    • Jackson의 objectMapper를 이용하여 JSon를 변환한다.
    • 변환하는 오브젝트 타입의 제한은 없지만, 프로퍼티를 가진 자바빈 스타일(커스텀 객체)이나 HashMap을 이용해야 정확한 변환 결과를 얻을 수 있다.



@EnableWebMvc

  • 이렇게 자동생성되는 메시지컨버터들은, 애노테이션 @EnableWebMvc안에 있는 WebMvcConfigurationSupport에 의해 재정의되고,더 많은 메시지컨버터들이 등록되어 관리받게 된다.
  • 애초에 @EnableWebMvcWebMvcConfigurer인터페이스를 상속받는 구현체 커스텀Configuration에 붙이는 애노테이션이다.
    • @EnableWebMvc MVC 관련된 bean들을 수정할때 쓰인다고 한다.

참고 링크

profile
한단계씩 올라가는 개발자

0개의 댓글