Spring

[Spring] HttpMessageConverter 정리

DevHyo 2022. 2. 1. 18:10

HttpMessageConverter를 사용하면, JSON 데이터를 Http Message Body에서 직접 읽거나 쓰는 경우에 편리하다.

@ResponseBody를 사용하는 경우

  • ViewResolver 대신에 HttpMessageConverter가 동작된다.
  • 기본 문자 처리의 경우, StringHttpMessageConverter를 사용한다.
  • 기본 객체 처리의 경우, MappingJackson2 HttpMessageConverter를 사용한다.
  • byte [] 처리 및 기타 여러 가지의 HttpMessageConverter가 기본으로 등록되어 있다.

HTTP 요청, 응답에 둘 다 사용

  • 요청의 경우, 메시지를 읽어서 객체로 바꾼 다음 컨트롤러에 파라미터로 넘겨주는 역할은 한다.
  • 응답의 경우, 컨트롤러에서 리턴 값을 가지고 Http 응답 메시지로 넣는 역할을 한다.
  • HttpMessageConverter는 인터페이스이며, canRead(), canWrite(), read(), write() 메서드가 존재한다.

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

Spring Boot의 기본 Message Converter (일부 생략)

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

    • 0 : ByteArrayHttpMessageConverter
    • 1 : StringHttpMessageConverter
    • 2: MappingJackson2HttpMessageConverter
ByteArrayHttpMessageConverter
  • byte [] 데이터 처리
  • 클래스 타입은 byte [], 미디어 타입은 */*이다. (미디어 타입의 경우, 아무거나 다 됨)
  • 요청 및 응답 예시

    • @RequestBody byte [] data
    • @ResponseBody return byte []의 경우, 쓰기 미디어 타입은 application/octet-stream으로 반환된다.
StringHttpMessageConverter
  • String 문자의 데이터 처리
  • 클래스 타입은 String, 미디어 타입은 */*이다. (미디어 타입의 경우, 아무거나 다 됨)
  • 요청 및 응답 예시

    • @RequestBody String data
    • @ResponseBody return "ok"의 경우, 쓰기 미디어 타입은 text/plain으로 반환된다.
MappingJackson2HttpMessageConverter
  • 클래스 타입은 객체 또는 HashMap, 미디어 타입은 application/json이다.
  • 요청 및 응답 예시

    • @RequestBody RequestMyData data
    • @ResponseBody return data의 경우, 쓰기 미디어 타입은 application/json으로 반환된다.

HTTP 요청 데이터 읽는 과정

  1. @RequestBody 또는 HttpEntity 파라미터를 사용한다.
  2. 메시지 컨버터가 메시지를 읽을 수 있는지 확인하기 위해서 canRead()를 호출한다.

    1. 대상 클래스 타입을 지원하는가? ex) byte[], String, 객체 또는 HashMap
    2. HTTP 요청의 Content-Type 미디어 타입을 지원하는가? ex) text/plain, application/json, */*
  3. canRead()에서 조건 1과 2를 만족하면, read()를 호출해서 객체를 반환한다.

HTTP 응답 데이터 생성 과정

  1. @ReponseBody 또는 HttpEntity로 값을 변환한다.
  2. 메시지 컨버터가 메시지를 쓸 수 있는지 확인하기 위해서 canWrite()를 호출한다.

    1. 리턴 대상 클래스 타입을 지원하는가?
    2. HTTP 요청의 Accept 미디어 타입을 지원하는가?
  3. canWrite()에서 조건 1과 2를 만족하면, write()를 호출해서 HTTP 응답 메시지 바디에 데이터를 생성한다.

참고

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

 

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 인프런 | 강의

웹 애플리케이션을 개발할 때 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 MVC의 핵심 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., -

www.inflearn.com