T_era
JSON 데이터 처리 (@RestController) 본문
JSON은 @RestController에서 가장 널리 사용되는 데이터 형식이며, 현재 대부분의 API는 Request와 Response 모두 JSON 형태로 통신한다.
HttpServletRequest 사용
@Data
public class Tutor {
private String name;
private int age;
}
@RestController
public class JsonController {
private ObjectMapper objectMapper = new ObjectMapper();
@PostMapping("/v1/request-body-json")
public void requestBodyJsonV1(
HttpServletRequest request,
HttpServletResponse response
) throws IOException {
// request body message를 Read
ServletInputStream inputStream = request.getInputStream();
// UTF-8 형식의 String으로 변환
String requestBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
// String requestBody를 ObjectMapper를 사용하여 Object로 변환
Tutor tutor = objectMapper.readValue(requestBody, Tutor.class);
// 응답
response.getWriter().write("tutor" + tutor);
}
}
HttpServletRequest를 사용하여 HTTP Message Body 데이터를 읽어 문자열로 변환하고, Jackson 라이브러리의 ObjectMapper를 사용하여 JSON 문자열을 Object로 변환한다.
@RequestBody 사용
@RestController
public class JsonController {
private ObjectMapper objectMapper = new ObjectMapper();
@PostMapping("/v2/request-body-json")
public String requesBodytJsonV2(@RequestBody String requestBody) throws IOException {
Tutor tutor = objectMapper.readValue(requestBody, Tutor.class);
return "tutor.getName() = " + tutor.getName() + "tutor.getAge() = " + tutor.getAge();
}
}
@RequestBody를 사용하여 HTTP Message Body의 JSON 데이터를 문자열 형태로 직접 바인딩한다. 이후 ObjectMapper를 사용하여 Object로 변환한다.
ObjectMapper 제거
@RestController
public class JsonController {
@PostMapping("/v3/request-body-json")
public String requestBodyJsonV3(@RequestBody Tutor tutor) {
Tutor requestBodyTutor = tutor;
return "tutor = " + requestBodyTutor;
}
}
@RequestBody 어노테이션을 사용하면 Object로 직접 매핑할 수 있다. HttpMessageConverter가 Request Body의 JSON 데이터를 개발자가 원하는 Object로 자동 변환해준다. 이는 MappingJackson2HttpMessageConverter의 역할이다. @RequestBody는 생략 불가능하며, 생략 시 @ModelAttribute로 처리되어 요청 파라미터를 매핑하려고 시도한다. Request Header의 Content-Type은 반드시 application/json이어야 하며, 이 정보를 기반으로 MessageConverter가 실행된다.
HttpEntity 사용
@RestController
public class JsonController {
@PostMapping("/v5/request-body-json")
public String requestBodyJsonV5(
HttpEntity<Tutor> httpEntity
) {
// 값을 꺼내서 사용해야 한다!
Tutor tutor = httpEntity.getBody();
return "tutor.getName() = " + tutor.getName() + " tutor.getAge() = " + tutor.getAge();
}
}
HttpEntity<Tutor>와 같이 Generic Type으로 대상 클래스를 지정하면, HttpMessageConverter에 의해 Request Body의 JSON 데이터가 해당 클래스 타입으로 변환되어 반환된다.
@ResponseBody
@Controller
public class JsonController {
@ResponseBody // @RestController = @Controller + @ResponseBody
@PostMapping("/v6/request-body-json")
public Tutor requestJson(@RequestBody Tutor tutor) {
return tutor;
}
}
@ResponseBody는 View 조회를 하지 않고 Response Body에 데이터를 직접 입력하여 반환한다. 요청뿐만 아니라 응답에도 HttpMessageConverter가 동작하며 (MappingJackson2HttpMessageConverter 적용), 응답 객체인 Tutor가 JSON 형태로 변환되어 반환된다. HttpEntity를 사용하여 응답을 처리하는 것도 가능하다.
요약
- 요청 데이터 바인딩 시 @RequestBody 사용이 필수적이며, 생략 시 @ModelAttribute가 적용된다.
- HttpMessageConverter는 요청 및 응답 데이터 변환을 담당하며, JSON 처리를 위해 MappingJackson2HttpMessageConverter가 사용된다.
- Request Header의 Content-Type을 application/json으로 설정하여 JSON 처리를 위한 Converter가 동작하도록 명시해야 한다. Header 정보를 기반으로 적절한 Converter가 선택된다.
'Programing > Spring' 카테고리의 다른 글
| HTTPMessageConverter (0) | 2025.05.07 |
|---|---|
| @RestController를 @Controller와 @ResponseBody를 나눠 쓰는 이유 (0) | 2025.05.07 |
| HttpEntity와 더 편리한 방법 (0) | 2025.05.07 |
| HTTP Message Body (요청) (0) | 2025.05.07 |
| @RequestParam과 @ModelAttribute (0) | 2025.05.07 |