HTTP 데이터를 객체로 처리하는 방법
@ModelAttribute
: Body 부분에 들어온 Query String 방식의 데이터를 객체에 maaping해서 가져올 수 있음.
- 해당 annotation 생략 가능
form 태그 POST
- POST http://localhost:8080/hello/request/form/model
- 데이터가 HTTP Body에 name=Robbie&age=95와 같은 형태로 담겨 서버로 전달됨
- 해당 데이터를 Java의 객체 형태로 받는 방법은 @ModelAttribute annotation을 사용한 후 Body 데이터를 받아올 객체로 선언
// 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);
}
Query string 방식
- GET http://localhost:8080/hello/request/form/param/model?name=Robbie&age=95
- 데이터가 여러 개 넘어온다고 했을 때 인자마다 전부 @RequestParam으로 다 받기에는 코드가 너무 복잡해지는 문제를 해결하기 위해 객체로 여러 데이터를 한 번에 받을 수 있도록 스프링에서 제공해 줌
// 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);
}
❓ @RequestParam, @ModelAttribute 모두 생략이 가능하면 Spring은 어떻게 구분할까?
➡️ 스프링은 해당 파라미터가 SimpleValueType이라면 @RequestParam으로 간주하고, 아니라면 @ModelAttribute가 생략이 되었다고 판단함. (예외적인 상황도 있긴 함.)
@RequestBody
: HTTP Body에 JSON 데이터를 담아 서버에 전달할 때 해당 Body 데이터를 Java의 객체로 전달 받을 수 있음.
- POST http://localhost:8080/hello/request/form/json
- JSON 형식으로 넘어옴 (Content type: application/json)
- @RequestBody를 꼭 달아줘야 함❗
// [Request sample]
// 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);
}
용어 정리
- SimpleValueType
: int 같은 원시타입, Integer같은 wrapper 타입, Date같은 타입 등을 이야기 함.
(우리가 만들지 않고 원래 존재하는 타입)
'내일배움캠프(Sparta) > Spring' 카테고리의 다른 글
[Spring] Database / SQL (0) | 2023.11.03 |
---|---|
[Spring] DTO (0) | 2023.11.02 |
[Spring] Jackson / Path Variable / Request Param (1) | 2023.11.02 |
[Spring] 데이터를 Client에 반환하는 방법 (0) | 2023.11.02 |
[Spring] Controller / 정적 페이지 / 동적 페이지 (0) | 2023.11.02 |