Spring/팀스파르타

10. HTTP 데이터를 객체로 처리하는 방법

열심히 해 2024. 10. 27. 20:13

 

@ModelAttribute

 

 

- form 태그 POST

// [Request sample]
// 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);
}

 

 

  • HTML의 form 태그를 사용하여 POST 방식으로 HTTP 요청을 보낼 수 있습니다.
  • 이때 해당 데이터는 HTTP Body에 name=Robbie&age=95 형태로 담겨져서 서버로 전달됩니다.
  • @ModelAttribute 애너테이션을 사용한 후, Body 데이터를 받아올 객체(Star star)를 선언하면 됩니다.

 

 

- Query String

// [Request sample]
// 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 애너테이션을 사용하면 Java의 객체로 데이터를 받아올 수 있습니다.
    • 파라미터에 선언한 Star 객체가 생성되고, 오버로딩된 생성자 혹은 Setter 메서드를 통해 요청된 name & age 의 값이 담겨집니다.
더보기

 ⚠️ @ModelAttribute는 생략이 가능합니다.

이때, 생각해볼 문제가있습니다! Spring에서는 @ModelAttribute뿐만 아니라 @RequestParam도 생략이 가능합니다. 그렇다면 Spring은 이를 어떻게 구분할까요? 간단하게 설명하자면 Spring은 해당 파라미터(매개변수)가 SimpleValueType이라면 @RequestParam으로 간주하고 아니라면 @ModelAttribute가 생략되어있다 판단합니다. SimpleValueType은 원시타입(int), Wrapper타입(Integer), Date등의 타입을 의미합니다.

 

 

 

@RequestBody

HTTP Body에 JSON 데이터를 담아 서버에 전달할 때 해당 Body 데이터를 Java의 객체로 전달 받을 수 있습니다.

// [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);
}

 

HTTP Body에 {"name":"Robbie","age":"95"} JSON 형태로 데이터가 서버에 전달되었을 때 @RequestBody 애너테이션을 사용해 데이터를 객체 형태로 받을 수 있습니다.

 

더보기

 ⚠️ 데이터를 Java의 객체로 받아올 때 주의할 점이 있습니다.

해당 객체의 필드에 데이터를 넣어주기 위해 set or get 메서드 또는 오버로딩된 생성자가 필요합니다. 예를 들어 @ModelAttribute 사용하여 데이터를 받아올 때 해당 객체에 set 메서드 혹은 오버로딩된 생성자가 없다면 받아온 데이터를 해당 객체의 필드에 담을 수 없습니다.이처럼 객체로 데이터를 받아올 때 데이터가 제대로 들어오지 않는다면 우선 해당 객체의 set or get 메서드 또는 오버로딩된 생성자의 유무를 확인하시면 좋습니다.

 

'Spring > 팀스파르타' 카테고리의 다른 글

12. Database란 무엇일까?  (0) 2024.10.27
11. DTO란 무엇일까?  (0) 2024.10.27
9. Path Variable과 Request Param  (0) 2024.10.26
8. Jackson이란 무엇일까?  (0) 2024.10.26
7. 데이터를 Client에 반환하는 방법  (0) 2024.10.26