ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • HTTP 데이터를 객체로 처리하는 방법
    spring/스프링 입문 주차 2024. 1. 18. 12:03

    @ModelAttribute
    POST http://localhost:8080/hello/request/form/model

    // [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 형태로 담겨져서 서버로 전달된다.
    - 해당 데이터를 Java의 객체 형태로 받는 방법은 @ModelAttribute 애너테이션을 사용한 후
     Body 데이터를 Star star 객체를 선언한다.

     

    Query String 방식
    GET http://localhost:8080/hello/request/form/param/model?name=Robbie&age=95

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

     

    - ?name=Robbie&age=95 처럼 데이터가 두 개만 있다면 괜찮지만, 여러개 있다면 
     @RequestParam 애너테이션으로 하나 씩 받아오기 힘들 수 있다.
    - 이때 @ModelAttribute 애너테이션을 사용하면 Java의 객체로 데이터를 받아올 수 있다.
     - 파라미터에 선언한 Star 객체가 생성되고, 오버로딩된 생성자 혹은 Setter 메서드를 통해
     요청된 name & age 의 값이 담겨진다.

    @ModelAttribute 또한 생략이 가능하다
    그렇다면 Spring은 생략된 @ModelAttribute 와 @RequestParam을 어떻게 구분할까?
    간단하게 설명하면 Spring은 해당 파라미터(매개변수)가 SimpleValueType이라면 @RequestParam으로 간주하고,
    아니라면 @ModelAttribute가 생략되어있다고 판단한다.
    SimpleValueType은 원시타입(int), Wraper타입(Integer), Date등의 타입을 의미한다.

     


     

    Body JSON 데이터

     

    다음은 HTTP Body에 JSON 데이터를 전달 받았을 때, 데이터를 Java의 객체로 받는 방법을 알아보자.
    POST http://localhost:8080/hello/request/form/json

    // [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 > 스프링 입문 주차' 카테고리의 다른 글

    IoC Container 와 Bean  (0) 2024.01.22
    JDBC란 무엇일까?  (0) 2024.01.18
    PathVariable과 ReqestParam  (0) 2024.01.18
    스프링에서 Jackson 형태로 반환하는 법  (0) 2024.01.18
    Controller 이해하기  (0) 2024.01.17
Designed by Tistory.