Client가 Server로 혹은 Server가 Server로 Request를 할 수 있다.
이번 포스팅에서는 Request가 왔을 때 Body를 String과 Json방식으로 받아오는 두가지 방법을 확인하겠다.
김영한님의 MVC 강의를 수강 후 작성된 포스팅이다.
1. Body가 String인 경우
Servlet의 모든 기능을 지원하기 때문에 Servlet처럼 받는 것도 가능하다.
하지만 이 경우 불필요하게 HttpServletRequest를 모두 받아야하므로 비효율적이다.
따라서 원하는 부분만 받아서 실행할 수 있다.
@PostMapping("/request-body-string")
public void requestBodyString(InputStream inputStream, Writer responseWriter) throws IOException {
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
log.info("messageBody={}",messageBody);
responseWriter.write("ok");
}
InputStream을 파라미터로 그대로 받아와 사용함을 확인할 수 있다.
이렇게 되면 불필요한 Request 객체를 받을 필요도 없고, 객체에서 불필요하게 InputStream을 꺼내는 일도 없다.
위 코드를 보면 InputStream과 Writer(Response) 두가지 객체를 받은 것을 확인할 수 있다.
스프링에서는 HttpEntity라는 것을 제공하며 이는 위와같은 객체를 모두 가지고 있다.
@PostMapping("/request-body-string")
public HttpEntity<String> requestBodyString(HttpEntity<String> httpEntity) throws IOException {
String body = httpEntity.getBody();
log.info("messageBody={}",body);
return new HttpEntity<>("ok");
}
HttpEntity의 getBody을 사용하면 String의 Body를 가져올 수 있다.
참고로 HttpEntity를 return해주면 response의 String으로 값이 날라가는 것을 볼 수 있다.
HttpEntity를 사용하지 않고 Annotation을 사용할 수도 있다.
@PostMapping("/request-body-string-v4")
public HttpEntity<String> requestBodyStringV4(@RequestBody String messageBody) throws IOException {
log.info("messageBody={}", messageBody);
return new HttpEntity<>("ok");
}
@RequestBody를 사용해 String으로 받으면 Body값을 가져올 수 있다.
이때 주의사항은 Request Parameter와 헷갈려하면 안된다는 것이다! @RequestBody는 반드시 붙여주어야한다.
만약 생략을하게 되면 Request Parameter로 인식하고 동작하게 되는 문제가 발생한다.
2. Body가 Json인 경우
Request의 Body가 Json인 경우는 최근 RestAPI에서 자주 사용되는 방법이다.
기존과 동일하게 Servlet처럼 처리할 수 있다. 그부분은 생략하고 annotation으로 처리하는 부분을 보겠다.
@ResponseBody
@PostMapping("/request-body-json-v2")
public String requestBodyJsonV2(@RequestBody String messageBody) throws IOException {
log.info("messageBody={}", messageBody);
HelloData helloData = objectMapper.readValue(messageBody, HelloData.class);
log.info("username={}, age= {}",helloData.getUsername(),helloData.getAge());
return "ok";
}
String과 동일하게 @RequestBody로 처리할 수 있다. 이때 String으로 받아온 데이터는 objectMapper를 활용하여 반드시 객체로 변경해주어야한다.
위에서 String으로 받았기 때문에 objectMapper를 사용했다. 바로 객체로 데이터를 받으면 해당 객체에 맞춰 json 데이터가 맵핑되어 굉장히 편리하게 사용할 수 있다.
@ResponseBody
@PostMapping("/request-body-json-v3")
public String requestBodyJsonV3(@RequestBody HelloData helloData) {
log.info("username={}, age= {}",helloData.getUsername(),helloData.getAge());
return "ok";
}
@RequestBody를 사용해서 받으면 바로 helloData에 객체들이 들어가게 되고 위 객체를 활용해 json데이터를 받을 수 있다.
추가 팁)이 때 return으로 helloData를 받으면 json값이 response로 보내진다.
이 방법 이외에도 HttpEntity를 사용해서 Json을 받는 방법도 있다. HttpEntity를 Parameter로 받고 제너럴을 HelloData로 사용해 HelloData를 꺼내서 쓰면 된다.(코드생략)
이 글은 김영한님의 'Spring MVC 1편' 강의를 공부한 후 작성한 글입니다.
'Back-end > Spring' 카테고리의 다른 글
HTTP Message Converter (2) | 2021.11.09 |
---|---|
SSR Response, Response Body (0) | 2021.11.08 |
Request Parameter 가져오기 (0) | 2021.11.04 |
스프링 빈 등록방법과 사용예시 (0) | 2021.07.30 |
Test Case 만들기 (0) | 2021.07.28 |