@RequestBody는 스프링에서 클라이언트가 json 형태로 보낸 데이터를 객체로 변환하는 역할을 합니다.
주로 Controller에서 데이터를 받을 때 사용합니다.
@RequestBody 사용법
@RequestBody 사용을 위해 다음과 같은 API를 생성하였습니다.
@PostMapping("/post")
public String postTest(@RequestBody TestDto dto) {
return dto.toString();
}
...
@Getter
@Setter
@ToString
@AllArgsConstructor
public class TestDto {
private Integer number;
private String name;
}
컨트롤러로 받은 DTO를 문자열로 변환해서 반환하는 API 입니다.
Curl을 사용하여 테스트해보겠습니다.
curl -X POST http://localhost:8080/post -d "{\"number\": \"111\", \"name\": \"Kim\"}" -H "Content-Type:
"application/json"
json으로 받은 데이터 그대로 반환되었습니다.
String같이 특정 객체가 아닌 클래스를 @RequestBody로 쓰면 어떻게 되는지 확인해보겠습니다.
@PostMapping("/post/string")
public String postTest(@RequestBody String string) {
return string;
}
입력한 그대로 반환되었습니다.
@RequestBody 여러개 사용
RequestBody 객체를 여러개 사용하면 어떻게 되는지 확인해보겠습니다.
@PostMapping("/post/multiple")
public String postTest(@RequestBody TestDto dto1, @RequestBody TestDto2 dto2) {
return dto1.toString() + ", " + dto2;
}
...
@Getter
@AllArgsConstructor
public class TestDto2 {
private String column;
}
스프링 로그에도 Resolved [org.springframework.http.converter.HttpMessageNotReadableException: Required request body is missing: 이라는 에러 로그가 찍힙니다.
@ResponseBody는 내부 컨버터에서 InputStream을 사용하는데, 한번 사용하고 닫기 때문에 두번은 사용할 수 없다고 설명하고 있습니다.
(출처: https://stackoverflow.com/questions/18690736/spring-mvc-controller-with-multiple-requestbody)
또한 @RequestBody가 없이 값을 body로 받을 수 없습니다.
body로 값을 받고싶다면 @RequestBody를 사용해야 합니다.