Spring MVC - Http 메시지 바디 요청, 응답 파싱

2021. 4. 8. 14:53SPRING/SPRING MVC

Http Get 메서드나 Form 미디어 타입으로 파라미터가 넘어오는 방식이 아닌, Http 메시지 바디로 요청, 응답하는 방법을 알아보자.

1. InputStream(Reader), OutputStream(Writer)

1
2
3
4
5
6
@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("ok");
}
cs
  • 메시지 컨버터 작동안함. 따라서 JSON 파싱을 원하면 ObjectMapper를 사용해야한다.

2. HttpEntity

1
2
3
4
5
6
@PostMapping("/request-body-string-v3")
public HttpEntity<String> requestBodyStringV3(HttpEntity<String> httpEntity) {
    String messageBody = httpEntity.getBody();
    log.info("messageBody={}", messageBody);
    return new HttpEntity<>("ok");
}
cs
  • HttpEntity를 상속받는 RequestEntity와 ResponseEntity를 사용하여 더 많은 기능을 활용할 수 있다.
  • RequestEntity - Http Method, URL 정보 조회 가능
  • ResponseEntity - 응답 코드, 응답 헤더 설정 가능
  • 메시지 컨버터 작동

3. @RequestBody, @ResponseBody

1
2
3
4
5
6
@ResponseBody
@PostMapping("/request-body-string-v4")
public String requestBodyStringV4(@RequestBody String messageBody) {
    log.info("messageBody={}", messageBody);
    return "ok";
}
cs
  • @RequestBody - Http 요청 메시지 바디를 파싱
  • @ResponseBody - Http 응답 메시지 바디에 데이터 파싱
  • @RequestBody는 생략 불가능. 생략되면 스프링은 @ModelAttribute로 인식하게 된다.
  • 만약 응답 코드를 설정하고 싶다면 메서드에 @ResponseStatus를 사용하면 되나, 어노테이션이기 때문에 동적으로 응답 상태 코드를 변경할 수 없어서 만약 동적으로 상태 코드가 변경되야하는 상황에서는 ResponseEntity를 사용해야한다.
  • 메시지 컨버터 작동