HTTP 메시지 컨버터

2024. 8. 25. 16:24Spring

◎ HTTP 메시지 컨버터

-> 뷰 템플릿으로 HTML을 생성하여 응답하지 않고, HTTP API와 같이 JSON과 같은 데이터를 HTTP 메시지 바디에 직접 읽거나 쓰는 경우 HTTP 메시지 컨버터를 통해 JSON과 객체를 변환하여 데이터를 주고 받는다.

-> 아래는 @ResponeBody의 동작 과정이다.

-> 웹 브라우저에서 요청을 하면 내장된 톰켓 서버를 거쳐 controller에 요청이 간다.

-> 해당 컨트롤러에 @ResponseBody가 적용되어 있어 HTTP 바디에 문자 내용을 직접 반환한다.

-> @ResponseBody가 있기 때문에 viewResolver를 호출하지 않고, HttpMessageConverter를 호출한다.

-> HttpMessageConverter는 JsonConverter와 StringConverter가 있는데(이 외에도 여러 컨버터가 존재) 요청 데이터에 따라 기본 문자인 경우 StringHttpMessageConverter가, 객체인 경우 MappingJackson2HttpMessageConverter가 호출된다.

* 응답의 경우 클라이언트의 HTTP Accept 헤더와 서버의 컨트롤러 반환타입 정보를 조합하여 HttpMessageConverter가 선택된다.

 

-> 스프링 MVC는 HTTP 요청의 경우 @RequestBody, HttpEntity(or ResponseEntity)가 있을 때, HTTP 응답의 경우 @ResposneBody, HttpEntity(or ResponseEntity)가 있을 때 HTTP 메시지 컨버터를 사용한다.

 

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

-> HTTP 메시지 컨버터는 HTTP 요청과 응답에 모두 사용된다.

-> canRead(), canWrite() : 메시지 컨버터가 해당 클래스, 미디어 타입을 지원하는지 파악

-> read(), write() : 메시지 컨버터를 통해 메시지를 읽고 쓰는 기능

 

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

- 숫자는 우선순위

0 : ByteArrayHttpMessageConverter -> byte[] 데이터 처리, 클래스 타입 : byte[], 미디어 타입 : */*

1 : String HttpMessageConverter -> String 문자로 데이털 처리, 클래스 타입 : String, 미디어 타입 : */*

2 : MappingJackson2HttpMessageConverter -> 클래스 타입 : 객체 or HashMap, 미디어 타입 : aplication/json

...

 

-> 스프링 부트에서 다양한 메시지 컨버터를 제공하고 대상 클래스 타입과 미디어 타입을 체크하여 만족하지 않으면 다음 메시지 컨버터로 우선순위가 변경된다.

 

◎ HTTP 요청 데이터 읽기 & HTTP 응답 데이터 생성 과정

<HTTP 요청 데이터 읽기>

- HTTP 요청이 들어오고 컨트롤러에서 @RequestBody, HttpEntity 파라미터 사용

- canRead()를 통해 메시지 컨버터가 메시지를 읽을 수 있는지 확인한다.

- 읽을 수 있다면 read()를 호출하여 객체를 생성하고 반환한다.

 

<HTTP 응답 데이터 생성>

- 컨트롤러에서 @ResponseBody, HttpEntity로 값이 반환된다.

- canWrite()를 통해 메시지 컨버터가 메시지를 쓸 수 있는지 확인한다.

- 쓸 수 있다면 write()를 호출하여 HTTP 응답 메시지 바디에 데이터를 생성한다.

 

 

★ 참고

스프링 MVC 1편