0. 개요
- 앞선 2개의 포스팅에서 Request parameter와 body를 조회하는 방법에 대해서 알아보았다.
- 이를 요약하자면 다음과 같이 정리할 수 있다.
1. 요청 parameter를 조회하는 경우
→ GET 방식의 HTTP request
→ <form> 태그를 이용한 POST 방식의 HTTP request
→ @RequestParam, @ModelAttribute를 사용한다.
2. 요청 body를 조회하는 경우
→ POST 방식의 HTTP request
→ @RequestBody, @ResponseBody를 사용한다.
- 그렇다면 JSON 형식으로 전달되는 Request body는 어떻게 조회할까? 천천히 알아보자.
1. Servlet
- HttpServlet을 이용하여 JSON 형식의 데이터를 다음과 같이 조회할 수 있다.
public class UserData {
private String username;
private int age;
}
@Slf4j
@Controller
public class JsonController {
/** 전달되는 JSON 형식
* {"username":"hello", "age":20}
* content-type: application/json
*/
private ObjectMapper objectMapper = new ObjectMapper();
@PostMapping("/json/servlet")
public void usingServlet(HttpServletRequest request, HttpServletResponse response) throws IOException {
ServletInputStream inputStream = request.getInputStream();
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
log.info("messageBody = {}", messageBody);
UserData userdata = objectMapper.readValue(messageBody, UserData.class);
log.info("username = {}, age = {}", userData.getUsername(), userData.getAge());
response.getWriter().write("JSON using HttpServlet");
}
}
- HttpServletRequest를 사용하여 request body을 읽기 위해서 ServletInputStream을 사용한다.
- ServletInputStream에서 읽어온 내용을 ObjectMapper를 이용하여 Model 클래스의 변수와 매핑한다.
- 그다음 Model로부터 데이터를 가져온다.
2. @RequestBody
- @RequestBody를 사용하면 Spring이 알아서 Request Body의 내용을 읽어준다.
- 그러나 JSON 형식에 맞게 데이터가 정리되지는 않은 상태이다.
- 그러므로 ObjectMapper를 사용하여 Model 클래스의 변수와 매핑한다.
@Slf4j
@Controller
public class JsonController {
/** 전달되는 JSON 형식
* {"username":"hello", "age":20}
* content-type: application/json
*/
private ObjectMapper objectMapper = new ObjectMapper();
@ResponseBody
@PostMapping("/json/request-body")
public String usingRequestBody(@RequestBody String messageBody) throws IOException {
log.info("messageBody = {}", messageBody);
UserData userData = objectMapper.readValue(messageBody, UserData.class);
log.info("username = {}, age = {}", userData.getUsername(), userData.getAge());
return "JSON using @RequestBody";
}
}
3. @RequestBody, Model
- @RequestBody와 Model 객체를 사용하여 JSON을 읽을 수 있다.
- 아래 코드와 같이 @RequestBody의 매개변수를 Model 객체로 설정하면 Spring이 알아서 매핑해준다.
- 그러므로 ObjectMapper를 따로 사용할 필요가 없다.
@Slf4j
@Controller
public class JsonController {
/** 전달되는 JSON 형식
* {"username":"hello", "age":20}
* content-type: application/json
*/
@ResponseBody
@PostMapping("/json/reqeust-body-model")
public String usingRequestBodyModel(@RequestBody UserData userData) {
log.info("userData = {}", userData);
log.info("username = {}, age = {}", userData.getUsername(), userData.getAge());
return "JSON using @RequestBody and Model";
}
}
* 주의하자!
- 이전 포스팅에서 Request Parameter를 조회하는 방법 중 하나로 @ModelAttribute를 사용하였다.
- @ModelAttribute의 매개변수로 Model 클래스를 사용하는 경우 @ModelAttribute를 생략해도 되었다.
- 위에서 설명한 방식에서 @RequestBody를 생략하는 경우, @ModelAttribute를 생략하는 경우와 동일한 상황이 된다.
- 그러므로 @RequestBody는 생략될 수 없다.
4. HttpEntity, Model
- 제네릭을 이용하여 HttpEntity의 자료형을 Model로 설정하면, Spring이 알아서 Model과 JSON 내용을 매핑해준다.
- 다만, 이 과정에서 HttpEntity.getBody() 메서드를 사용하여 특정 Model 클래스와 매핑됨을 선언해준다.
@Slf4j
@Controller
public class JsonController {
/** 전달되는 JSON 형식
* {"username":"hello", "age":20}
* content-type: application/json
*/
@ResponseBody
@PostMapping("/json/http-entity-model")
public String requestBodyJsonV4(HttpEntity<UserData> httpEntity) {
UserData data = httpEntity.getBody();
log.info("httpEntity = {}", data);
log.info("username = {}, age = {}", data.getUsername(), data.getAge());
return "JSON using HttpEntity and Model";
}
}
5. Model 객체를 사용한 응답 방법
- 메서드의 반환형을 Model 클래스로 설정하여 Client에게 JSON 형식의 응답 메시지를 전달할 수 있다.
- 이를 위해서는 메서드의 반환형을 Model 클래스로 설정하고 @ResponseBody를 부착하면 된다.
@Slf4j
@Controller
public class JsonController {
/** 전달되는 JSON 형식
* {"username":"hello", "age":20}
* content-type: application/json
*/
@ResponseBody
@PostMapping("/json/response-json")
public UserData usingResponseBody(@RequestBody UserData data) {
log.info("httpEntity = {}", data);
log.info("username = {}, age = {}", data.getUsername(), data.getAge());
return data;
}
}
'Back-end > Spring MVC 개념' 카테고리의 다른 글
18. HTTP message converter (0) | 2022.03.18 |
---|---|
17. Response 처리방법 (0) | 2022.03.17 |
15. Request - message Body 조회방법 (0) | 2022.03.15 |
14. Request - URL parameter 조회방법 (0) | 2022.03.14 |
13. Annotation 기반의 URL 매핑 (0) | 2022.03.10 |
댓글