@RequestBody, @ResponseBody
브라우저와 웹 서버 간에 데이터를 주고받을 때 사용되는 HTTP 프로토콜은 다음 그림과 같이 헤더와 몸체로 구성되어 있다.

요청 몸체에는 브라우저가 전송한 데이터가 담기는데, 이 데이터의 형식은 Content-Type 헤더 값으로 지정한다. 위 그림의 경우 요청 몸체의 형식이 'multipart/form-data'라고 지정되어 있다. 응답도 동일하게 헤더와 몸체로 구성되며, Content-Type 헤더를 이용해서 몸체의 데이터 형식을 지정한다.
@RequestBody 어노테이션은 요청 몸체를 자바 객체로 변환할 때 사용된다. 예를 들어 요청 파라미터 문자열을 String 자바 객체로 변환하거나, JSON 형식의 요청 몸체를 자바 객체로 변환할 때 @RequestBody 어노테이션을 사용한다. 비슷하게 @ResponseBody 어노테이션은 자바 객체를 응답 몸체로 변환하기 위해 사용된다. 보통 자바 객체를 JSON 형식이나 XML 형식의 문자열로 변환할 때 @ResponseBody 어노테이션을 사용한다.
다음 코드를 살펴보자.
@Controller
@RequestMapping("/simple")
public class SimpleConverterController {
@RequestMapping(method = RequestMethod.GET)
public String simpleForm() {
return "simple";
}
@RequestMapping(method = RequestMethod.POST)
@ResponseBody
public String simple(@RequestBody String body) {
return body;
}
}
위 코드에서 @RequestBody 어노테이션은 String 타입의 body 파라미터에 적용되어 있는데, 이 경우 스프링 MVC는 POST 방식으로 전송된 HTTP 요청 데이터를 String 타입의 body 파라미터로 전달한다. 그리고 메서드에 @ResponseBody 어노테이션이 붙으면, 스프링 MVC는 메서드의 리턴 값을 HTTP 응답 데이터로 사용한다. 위의 경우 simple() 메서드의 리턴 값이 String 타입이므로 String 데이터를 HTTP 응답 데이터로 전송한다.
HttpMessageConverter를 이용한 변환 처리
스프링 MVC는 @RequestBody 어노테이션이나 @ResponseBody 어노테이션이 있으면, HttpMessageConverter를 이용해서 자바 객체와 HTTP 요청 / 응답 몸체 사이의 변환을 처리한다. 스프링은 다양한 타입을 위한 HttpMessageConverter 구현체를 제공하고 있다. 예를 들어 아래 코드에서 요청 몸체를 @RequestBody 어노테이션이 적용된 body로 변환할 때나 String 타입의 리턴 객체를 응답 몸체로 변환할 때는 StringHttpMessageConverter를 사용한다.
@RequestMapping(method = RequestMethod.POST)
@ResponseBody
public String simple(@RequestBody String body) {
return body;
}
<mvc:annotation-driven> 설정이나 @EnableWebMvc 어노테이션을 사용하면, StringHttpMessageConverter를 포함해 다수의 HttpMessageConverter 구현 클래스를 등록한다. 다음은 그 예이다.
- StringHttpMessageConverter : 요청 몸체를 문자열로 변환하거나 문자열을 응답 몸체로 변환
- Jaxb2RootElementHttpMessageConverter : XML과 자바 객체 사이의 변환
- MappingJackson2HttpMessageConverter : JSON과 자바 객체 사이의 변환
- MappingJacksonHttpMessageConverter : JSON과 자바 객체 사이의 변환
- ByteArrayHttpMessageConverter : 요청 몸체를 byte 배열로 변환하거나 byte 배열을 응답 몸체로 변환
- ResourceHttpMessageConverter : 요청 몸체를 스프링의 Resource로 변환하거나 Resource를 응답 몸체로 변환
- SourceHttpMessageConverter : XML 요청 몸체를 XML Source로 변환하거나 XML Source를 XML 응답으로 변환
- AllEncompassingFormHttpMessageConverter : 폼 전송 형식의 요청 몸체를 MultiValueMap으로 변환하거나 MultiValueMap을 응답 몸체로 변환
Reference
- 웹 개발자를 위한 Spring 4.0 프로그래밍 (최범균 저)
'Spring' 카테고리의 다른 글
| [Spring] 스프링 데이터베이스(1) - 템플릿 클래스 (0) | 2022.04.17 |
|---|---|
| [Spring] 스프링 MVC(19) - 서블릿 3 기반 설정 (0) | 2022.04.16 |
| [Spring] 스프링 MVC(17) - 핸들러, HandlerMapping, HandlerAdapter (0) | 2022.04.07 |
| [Spring] 스프링 MVC(16) - DelegatingFilterProxy (0) | 2022.04.06 |
| [Spring] 스프링 MVC(15) - WebApplicationContext (0) | 2022.04.05 |