[Spring MVC] HTTP 요청 메시지
단순 텍스트
- HTTP message body에 데이터를 직접 담아서 요청
- HTTP API에서 주로 사용, JSON, XML, TEXT
- 데이터 형식은 주로 JSON 사용
- POST, PUT, PATCH
- 메시지 바디의 데이터를
InputStream
을 사용해서 읽을 수 있다.
요청 파라미터와 다르게, HTTP 메시지 바디를 통해 데이터가 직접 넘어오는 경우는 @RequestParam
, @ModelAttribute
를 사용할 수 없다.
requestBodyStringV1
@PostMapping("/request-body-string-v1")
public void requestBodyString(HttpServletRequest request, HttpServletResponse response) throws IOException {
ServletInputStream inputStream = request.getInputStream();
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
response.getWriter().write("ok");
}
requestBodyStringV2
Input, Output 스트림, Reader
@PostMapping("/request-body-string-v2")
public void requestBodyStringV2(InputStream inputStream, Writer responseWriter) throws IOException {
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
responseWriter.write("ok");
}
스프링 MVC가 지원하는 파라미터
- InputStream(Reader): HTTP 요청 메시지 바디의 내용을 직접 조회
- OutputStream(Writer): HTTP 응답 메시지의 바디에 직접 결과 출력
requestBodyStringV3
HttpEntity
@PostMapping("/request-body-string-v3")
public HttpEntity<String> requestBodyStringV3(HttpEntity<String> httpEntity) {
String messageBody = httpEntity.getBody();
return new HttpEntity<>("ok");
}
- HttpEntity: HTTP header, body 정보를 편리하게 조회
- 메시지 바디 정보를 직접 조회
- 요청 파라미터를 조회하는 기능과 관계 없다.(
@RequestParam
X,@ModelAttribute
X)
- HttpEntity는 응답에서도 사용 가능
- 메시지 바디 정보 직접 반환
- 헤더 정보 포함 가능
- view 조회 X
HttpEntity
를 상속받은 객체
- RequestEntity
- HttpMethod, url 정보가 추가, 요청에서 사용
- ResponseEntity
- HTTP 상태 코드 설정 가능, 응답에서 사용
return new ResponseEntity<String>("Hello", responseHeaders, HttpStatus.CREATED)
참고
스프링 MVC 내부에서 HTTP 메시지 바디를 읽어서 문자나 객체로 반환해서 전달해주는데, 이때HttpMessageConverter
기능을 사용한다.
requestBodyStringV4
@RequestBody
@ResponseBody
@PostMapping("/request-body-string-v4")
public String requestBodyStringV4(@RequestBody String messageBody) {
return "ok";
}
@RequestBody
를 사용하면 HTTP 메시지 바디 정보를 편리하게 조회할 수 있다.- 헤더 정보가 필요하면
HttpEntity
또는@RequestHeadr
를 사용하면 된다.
요청 파라미터 / HTTP 메시지 바디
- 요청 파라미터를 조회하는 기능:
@RequestParam
,@ModelAttribute
- HTTP 메시지 바디를 직접 조회하는 기능:
@RequestBody
@ResponseBody
@ResponseBody
를 사용하면 응답 결과를 HTTP 메시지 바디에 직접 담아서 전달할 수 있다.
JSON
requestBodyJsonV1
@Slf4j
@Controller
public class RequestBodyJsonController {
private ObjectMapper objectMapper = new ObjectMapper();
@PostMapping("/request-body-json-v1")
public void requestBodyJsonV1(HttpServletRequest request, HttpServletResponse response) throws IOException {
ServletInputStream inputStream = request.getInputStream();
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
HelloData data = objectMapper.readValue(messageBody, HelloData.class);
log.info("username={}, age={}", data.getUsername(), data.getAge());
response.getWriter().write("ok");
}
}
- HttpServletRequest를 사용해 HTTP 메시지 바디에서 데이터를 읽어와서, 문자로 변환.
- 문자로 된 JSON 데이터를 Jackson 라이브러리인
objectMapper
를 사용해서 자바 객체로 변환.
requestBodyJsonV2
@RequestBody 문자 반환
@ResponseBody
@PostMapping("/request-body-json-v2")
public String requestBodyJsonV2(@RequestBody String messageBody) throws IOException {
HelloData data = objectMapper.readValue(messageBody, HelloData.class);
return "ok";
}
requestBodyJsonV3
@RequestBody 객체 변환
@ResponseBody
@PostMapping("/request-body-json-v3")
public String requestBodyJsonV3(@RequestBody HelloData data) {
return "ok";
}
@RequestBody HelloData data
@RequestBody
에 직접 만든 객체를 지정할 수 있다.HttpEntity
,@RequestBody
를 사용하면 HTTP 메시지 컨버터가 HTTP 메시지 바디의 내용을 원하는 문자나 객체 등으로 변환해준다.
@RequestBody는 생략 불가능
스프링은 String
, int
, Integer
같이 단순 타입은 @RequestParam
을 생략할 수 있고, 나머지는 @ModelAttribute
를 생략할 수 있다.
따라서, HelloData에 @RequestBody
를 생략하면 @ModelAttribute
가 적용되어 버린다. 그렇기 때문에 생략하면 HTTP 메시지 바디가 아닌 요청 파라미터를 처리하게 된다.
requestBodyJsonV4
HttpEntity
@ResponseBody
@PostMapping("/request-body-json-v4")
public String requestBodyJsonV4(HttpEntity<HelloData> httpEntity) {
HelloData data = httpEntity.getBody();
return "ok";
}
requestBodyJsonV5
@ResponseBody
@PostMapping("/request-body-json-v5")
public HelloData requestBodyJsonV5(@RequestBody HelloData data) {
return data;
}
@RequestBody
요청- JSON 요청 -> HTTP 메시지 컨버터 -> 객체
@ResponseBody
응답- 객체 -> HTTP 메시지 컨버터 -> JSON 응답
댓글남기기