@RequestBody 와 @ModelAttribute 어노테이션은 클라이언트 측에서 보낸 데이터를 Java 에서 사용할 수 있도록
데이터 자동 바인딩 해주는 어노테이션이다.
@RequestBody
클라이언트가 보내는 HTTP 요청 본문(Body안의 JSON 및 XML 데이터)을 Java Object로 변환하는 것이다.
HTTP 요청 본문 데이터는 Spring에서 제공하는 HttpMessageConverter를 통해 타입에 맞는 객체로 변환된다.
특징
- @RequestBody를 사용하면 요청 본문의 JSON, XML, Text 등의 데이터가 적합한 HttpMessageConverter를 통해
파싱되어 Java 객체로 변환된다.
- @RequestBody를 사용할 객체는 필드를 바인딩할 생성자나 Setter 메서드가 필요 없다.
* 직렬화를 위해 기본 생성자는 필수다.
* 데이터 바인딩을 위한 필드명을 알아내기 위해 getter 도는 setter 중 1가지는 정의되어 있어야 한다.
예)
@RequestMapping(value="/test")
public void testController(@RequestBody TestVO testVO){
}
주의사항
View 에서 Ajax 를 통해 데이터를 넘길 경우 contentType 과 json 데이터의 문자열 파싱이 필요하다.
아래와 같이 넘길 json Object 에 대해 string 형으로 파싱하고 넘길 데이터에 대한 내용 설정을 위한
contentType 설정이 필요하다.
// {name: "obj", phone: "01011112222"}
let obj = new Object();
obj.name = "obj";
obj.phone = "01011112222";
$.ajax({
url: controller mapping url,
type : "POST",
data : JSON.stringify(obj),
dataType: "json",
contentType: "application/json;charset=utf-8",
success: function(data){
console.log(data);
}
})
@ModelAttribute
클라이언트가 보내는 HTTP 파라미터들을 특정 Java Object에 바인딩하는 것이다.
URL ? name=seq&number=2 와 같은 Query String 형태 혹은 요청 본문에 넘어오는 Form 형태의 데이터를
처리한다.
특징
- @ModelAttribute를 사용하면 HTTP 파라미터 데이터를 Java 객체에 매핑할 수 있다.
* 객체의 필드에 접근해 데이터를 바인딩할 수 있는 생성자 혹은 setter 메서드가 필요하다.
- Query String(Get 방식 요청) 및 Form 형식이 아닌 데이터는 처리할 수 없다.
예)
// HTML
<form id="form_test">
<input type="text" id="test1" name="test1"><br>
<input type="text" id="test2" name="test2"><br>
<input type="text" id="test3" name="test3"><br>
<input type="text" id="test4" name="test4"><br>
</form>
<button type="button" id="insert" onclick="form_insert()">입력</button>
// Javascript
let form_insert() = function(){
$.ajax({
type: "POST",
url: "/form/test",
data: $("#form_test").serialize(),
dataType: "html",
success: function(result){
console.log(result);
}
})
}
// Controller
@RequestMapping("/form/test")
public String formTest(@ModelAttribute("data") TestVO data){
System.out.println("test : "+data.toString());
}
위와 같이 Form 태그 데이터들을 jquery 의 serialize 를 이용해 파리미터 형식으로 데이터를 넘긴다.
jquery serialize() 함수를 사용할 경우 데이터는 test1=123&test2=456&test3=789 형식으로 넘어간다.
이러한 데이터를 Controller 에서 ModelAttribute 어노테이션을 사용해 Model 형식으로 전달받는다.