Query String 데이터를 객체로 받아오는 방법
// POST http://localhost:8080/hello/request/form/model
// Header
// Content type: application/x-www-form-urlencoded
// Body
// name=Robbie&age=95
@PostMapping("/form/model")
@ResponseBody
public String helloRequestBodyForm(@ModelAttribute Star star) {
return String.format("Hello, @ModelAttribute.<br> (name = %s, age = %d) ", star.name, star.age);
}
name=Robbie&age=95
형태로 담겨져서 서버로 전달됨@ModelAttribute
애너테이션을 사용한 후 Body 데이터를 Star star
받아올 객체를 선언합니다.// GET http://localhost:8080/hello/request/form/param/model?name=Robbie&age=95
@GetMapping("/form/param/model")
@ResponseBody
public String helloRequestParam(@ModelAttribute Star star) {
return String.format("Hello, @ModelAttribute.<br> (name = %s, age = %d) ", star.name, star.age);
}
?name=Robbie&age=95
처럼 데이터가 두 개만 있다면 괜찮지만 여러 개 있다면 @RequestParam
애너테이션으로 하나씩 받아오기 힘들 수 있음@ModelAttribute
애너테이션을 사용하면 Java의 객체로 데이터를 받아올 수 있음Star
객체가 생성되고, 오버로딩된 생성자 혹은 Setter 메서드를 통해 요청된 name & age
의 값이 담겨짐@ModelAttribute
도 생략 가능🤔 Spring에서는 @ModelAttribute뿐만 아니라 @RequestParam도 생략이 가능하다. 그렇다면 Spring은 이를 어떻게 구분할까?
간단하게 설명하자면 Spring은 해당 파라미터(매개변수)가 SimpleValueType이라면 @RequestParam으로 간주하고 아니라면 @ModelAttribute가 생략되어있다 판단한다.
SimpleValueType은 원시타입(int), Wrapper타입(Integer), Date등의 타입을 의미한다.
HTTP Body에 JSON 데이터를 담아 서버에 전달할 때 해당 Body 데이터를 Java의 객체로 전달 받는 방법
// POST http://localhost:8080/hello/request/form/json
// Header
// Content type: application/json
// Body
// {"name":"Robbie","age":"95"}
@PostMapping("/form/json")
@ResponseBody
public String helloPostRequestJson(@RequestBody Star star) {
return String.format("Hello, @RequestBody.<br> (name = %s, age = %d) ", star.name, star.age);
}
{"name":"Robbie","age":"95"}
JSON 형태로 데이터가 서버에 전달되었을 때 @RequestBody
애너테이션을 사용해 데이터를 객체 형태로 받을 수 있음🚨 데이터를 Java의 객체로 받아올 때 주의사항
- 해당 객체의 필드에 데이터를 넣어주기 위해 set or get 메서드 또는 오버로딩된 생성자가 필요하다.
- 예를 들어 @ModelAttribute 사용하여 데이터를 받아올 때 해당 객체에 set 메서드 혹은 오버로딩된 생성자가 없다면 받아온 데이터를 해당 객체의 필드에 담을 수 없다.
- 해당 객체의 필드명과 데이터의 key명이 일치해야 한다.
- 만약 다를 경우, null값이 들어가게 된다.