본문 바로가기
내일배움캠프(Sparta)/Spring

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

by mmm- 2023. 11. 2.

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같은 타입 등을 이야기 함.
    (우리가 만들지 않고 원래 존재하는 타입)