스프링 MVC가 지원하는 파라미터
@PostMapping("/request-body-string-v2")
public void requestBodyStringV2(InputStream inputStream, Writer responseWriter) throws IOException {
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
log.info("messageBody = {}", messageBody);
responseWriter.write(messageBody);
}
- InputStream(Reader) : HTTP 요청 메시지 바디의 내용을 직접 조회
- OutputStream(Writer) : HTTP 응답 메시지의 바디에 직접 결과 출력
HttpEntity
@PostMapping("/request-body-string-v3")
public HttpEntity<String> requestBodyStringV3(HttpEntity<String> httpEntity) throws IOException {
final String messageBody = httpEntity.getBody();
log.info("messageBody = {}", messageBody);
return new HttpEntity<>(messageBody);
}
- HttpEntity : HTTP header, body 정보를 편리하게 조회
- 메시지 바디 정보를 직접 조회
- 요청 파라미터를 조회하는 기능과 관계 없다. (@RequestParam, @ModelAttribute X)
- httpEntity는 응답에도 사용 가능
- 메시지 바디 정보 직접 반환
- 헤더 정보 포함 가능
- view 조회 X
RequestEntity, ResponseEntity
@PostMapping("/request-body-string-v4")
public ResponseEntity<String> requestBodyStringV4(RequestEntity<String> requestEntity) throws IOException {
final HttpHeaders requestHeaders = requestEntity.getHeaders();
final String messageBody = requestEntity.getBody();
log.info("messageBody = {}", messageBody);
return new ResponseEntity<>(messageBody, requestHeaders, HttpStatus.OK);
}
- RequestBody
- HttpMethod, url 정보가 추가 요청에서 사용
- ResponseBody
- HTTP 상태 코드 설정 가능, 응답에서 사용
cf) 참고
- 스프링 MVC 내부에서 HTTP 메시지 바디를 읽어서 문자나 객체로 변환해서 전달해주는데 이때 HTTP 메시지 컨버터라는 기능을 사용한다.
@RequestBody
@PostMapping("/request-body-string-v5")
public ResponseEntity<String> requestBodyStringV5(@RequestBody String messageBody) throws IOException {
log.info("messageBody = {}", messageBody);
return new ResponseEntity<>(messageBody, HttpStatus.OK);
}
- @RequestBody를 사용하면 HTTP 메시지 바디 정보를 편리하게 조회할 수 있다.
- 참고로 헤더 정보가 필요하다면 @RequestHeader를 사용하면 된다.
- 이렇게 메시지 바디를 직접 조회하는 기능은 요청 파라미터를 조회하는 @RequestParam, @ModelAttribute 와는 전혀 관계가 없다.
요청 파라미터 vs HTTP 메시지 바디
- 요청 파라미터를 조회하는 기능 : @RequestParam, @ModelAttribute
- HTTP 메시지 바디를 직접 조회하는 기능: @RequestBody
@RequestBody 객체 파라미터
@PostMapping("/request-body-json-v3")
public ResponseEntity<HelloData> requestBodyJsonV3(@RequestBody HelloData helloData) throws JsonProcessingException {
log.info("helloData = {}", helloData);
return new ResponseEntity<>(helloData, HttpStatus.CREATED);
}
- @RequestBody HelloData helloData
- @RequestBody에 직접 만든 객체를 지정할 수 있다.
- HttpEntity, @RequestBody를 사용하면 HTTP 메시지 컨버터가 HTTP 메시지 바디의 내용을 우리가 원하는 문자나 객체등으로 변환해준다.
- HTTP 메시지 컨버터는 문자 뿐만 아니라 JSON도 객체로 변환해준다.