HTTP 메시지 컨버터에 관하여

Leehobin·2024년 2월 22일

Spring

목록 보기
2/2
post-thumbnail

HTTP 메세지 컨버터란?

HTTP 메시지 컨버터란, 요청 본문에서 메시지를 읽어들이거나(@RequestBody), 응답 본문에 메시지를 작성할 때(@ResponseBody) 사용하는 컨버터다.

HTTP 메세지 컨버터 인터페이스

  • HTTP 요청, 응답 양방향으로 사용
  • canRead(), canWrite(): 메시지 컨버터가 해당 클래스, 미디어 타입을 지원하는지 체크
  • read(), write(): 메시지 컨버터를 통해 메시지를 읽고 쓰는 기능

스프링 부트의 기본 메시지 컨버터

ByteArrayHttpMessageConverter
StringHttpMessageConverter
MappingJacksonHttpMessageConverter
...

  • 기본적으로 위의 컨버터들을 지원함
    - 대상 클래스 타입과 미디어 타입을 체크해 사용여부 결정
    (만족하지 않는 경우 다음 메시지 컨버터로 우선순위 넘어감)

  • ex1: @RequestBody String data 형식으로 요청이 오면 StringHttpMessageConverter 사용

  • ex2: @ResponseBody return helloData로 쓰고 미디어 타입 application/json인 경우 MappingJacksonHttpMessageConverter 사용

HTTP 요청 데이터 읽기

HTTP 요청이 들어오고, 컨트롤러에서 @RequestBody나 HttpEntity 파라미터 사용
메시지 컨버터가 canRead() 호출 // 읽을 수 있는 메시지인지 확인

  • 대상 클래스 타입과 HTTP의 Content-Type 미디어 타입 지원하는지
    canRead() 만족 시 read() 호출해 객체 생성 및 반환

HTTP 응답 데이터 생성

컨트롤러에서 @ResponseBody나 HttpEntity로 값 반환
메시지 컨버터가 canWrite() 호출 // 메시지를 쓸 수 있는지 확인

  • 대상 클래스 타입과 HTTP의 Accept 미디어 타입 지원하는지
    canWrite() 만족 시 write() 호출해 HTTP 응답 메시지 바디에 데이터 생성

HTTP 메시지 컨버터의 실행

SpringMVC 구조

위 과정에서 5번 과정을 주목해보자.
어노테이션 기반의 핸들러(컨트롤러)의 여러 파라미터를 생성해서 호출할 수 있는 '핸들러 어댑터'
이 어댑터가 HTTP 메시지 컨버터와 관련이 있다.

먼저, @RequestMapping을 처리하는 핸들러 어댑터인 RequestMappingHandlerAdapter를 자세히 살펴보자
1. ArgumentResolver 호출
ArgumentResolver: 매우 다양한 종류의 파라미터를 유연하게 처리해 파라미터 값(객체) 생성
2. 파라미터 값이 준비되면 컨트롤러를 호출하며 값을 넘겨줌

그럼 이제 본격적으로 HTTP 메시지 컨버터는 어디있을까?


만약 ArgumentResolver에 요청하는 파라미터가 @RequestBody 또는 HttpEntity인 경우 HTTP 메시지 컨버터를 사용해 'read' 한다. 응답의 경우에도 @ResponseBody 또는 HttpEntity를 처리하는 ReturnValueHandler에서 HTTP 메시지 컨버터를 호출해 응답 결과를 'write' 한다.

profile
기록하는 사람

0개의 댓글