Study/spring

[Java] Spring Controller @RequestBody 사용법

 

@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"

RequestBody 사용 결과
RequestBody 사용 결과

json으로 받은 데이터 그대로 반환되었습니다.

 

 

String같이 특정 객체가 아닌 클래스를 @RequestBody로 쓰면 어떻게 되는지 확인해보겠습니다.

@PostMapping("/post/string")
public String postTest(@RequestBody String string) {
	return string;
}

RequestBody에 String 사용 시 입력 값 그대로 반환
RequestBody에 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;
}

RequestBody 여러개 사용 시 오류 발생
RequestBody 여러개 사용 시 오류 발생

스프링 로그에도  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를 사용해야 합니다.