@RequestBody
HTTP 요청으로 넘어오는 Body 의 내용을 HttpMessageConverter 를 통해 Java Object로 역직렬화한다.
바이너리 파일을 포함하고 있지 않은 데이터를 받는 역할을 한다.
* HttpMessageConverter
: HTTP 요청과 응답에 대해서 "전략 패턴"을 사용해 Converting 해주는 역할
@RequestBody 어노테이션은 HTTP 요청으로 같이 넘어오는 Header 의 Content-Type을 보고
어떤 Converter 를 사용할지 정하므로 Content-Type 은 반드시 명시해야한다.
자주쓰는 Content-Type 종류
- application/json : { key : value } 형태인 json 형태로 전송
- application/x-www-form-urlencoded : name=obo&number=123456 형태인 쿼리 스트링 형태로 전송
- multipart/form-data : 파일 업로드시 사용되며, 파일을 포함한 여러 데이터가 part(쪼개서) 형식으로 나눠서 전송
// javascript
let json = new Object();
json.name = 'obo';
json.number = '01011112222';
// 형식 - { name : 'obo', number : '01011112222' }
$.ajax({
type: 'POST'
url: '/main',
dataType: 'json',
contentType: 'application/json',
data: JSON.stringify(json),
success: function(result){
console.log(result);
}
})
// model
public class TestModel {
String name;
String number;
...getter
...setter
...toString
}
// java Controller
@RequestMapping(value="/main")
@ResponseBody
public String main(@RequestBody TestModel model){
system.out.println("model : "+model.toString());
// 결과
// TestModel { "name" : "obo", "number" : "01011112222" }
return "";
}
@RequestParam
HTTP 요청에서 하나의 파라미터를 받을 때 사용한다. 기본적으로 파라미터가 필수적으로
들어오게 설정되어 있기 때문에 파라미터가 들어오지 않을 경우 에러가 발생할 수 있다.
들어오지 않을수도 있다면 @RequestParam 의 required 설정을 false 로 설정한다.
@RequestParam 또한 @RequestPart 와 같이 MultipartFile 을 받을 때 사용할 수 있다.
@RequestPart 와 다른점은 @RequestParam 의 경우 파라미터가 String 이나 MultipartFile 이 아닌경우
Converter 나 PropertyEditor 에 의해 처리 된다.
하지만 @RequestPart 는 HttpMessageConverter 가 Content-Type 을 참고하여 알맞는 Converter 로
처리한다.
MultipartFile 을 여러개로 받기 위해선 List<MultipartFile> 형태로 받을 수 있으며,
모든 파라미터를 Map<String, Object> 처럼 한번에 받을 수 있으나 유지보수성이 떨어진다.
많은 데이터를 주고 받을 때는 @RequestBody 와 DTO 를 이용하는 편이 좋다.
아래 데이터를 보면 Content-Type 이 "application/x-www-form-urlencoded" 인 경우는 form 태그 형식의 쿼리 스트링 형식으로 데이터를 하나하나 날린다. ex) ?name=123&number=123123
// javascript
let json = "name=obo&number=01011112222";
$.ajax({
type: 'POST'
url: '/main',
dataType: 'json',
contentType: 'application/x-www-form-urlencoded',
data: json,
success: function(result){
console.log(result);
}
})
// java Controller
@RequestMapping(value="/main")
@ResponseBody
public String main(
@RequestParam("name") String name,
@RequestParam("number") String number
){
system.out.println("name: "+name); system.out.println("number: "+number);
// 결과 // name: obo
// number: 01011112222
return "";
}
@RequestPart
Content-Type 이 'multipart/form-data' 에 특화된 어노테이션이다.
MultipartFile 이 포함되는 경우에 MultipartResolver가 동작하여 역직렬화를 하게 된다.
MultipartFile 이 포함되지 않는 경우에 @RequestBody 와 같이 HttpMessageConverter가 동작된다.
아래는 fileList 에 파일이 2개 있다고 가정한 후에 FormData Object 를 생성하고 데이터를 전달한다.
processData 는 기본적으로 true 가 되어 있는데 쿼리 스트링형태로 데이터를 날린다.
쿼리스트링 형태로 데이터를 날리지 않기 때문에 false 를 설정한다.
let formData = new FormData();
formData.append('b_title', $("#boastTitle").val());
formData.append('server_seq', $("#server_seq").val());
formData.append('b_content', b_content);
fileList.forEach((data, index) => {
formData.append('file', data);
});
$.ajax({
url: contextPath + "/boast/ins/submit",
type: "POST",
data: formData,
processData: false,
contentType: false,
success: function(result) {
}
})