새소식

반응형
Java/Spring Boot

@RequestBody 와 @ModelAttribute

  • -
728x90
반응형

@RequestBody 와 @ModelAttribute 어노테이션은 클라이언트 측에서 보낸 데이터를 Java 에서 사용할 수 있도록

데이터 자동 바인딩 해주는 어노테이션이다.

 

@RequestBody

클라이언트가 보내는 HTTP 요청 본문(Body안의 JSON 및 XML 데이터)을 Java Object로 변환하는 것이다.

HTTP 요청 본문 데이터는 Spring에서 제공하는 HttpMessageConverter를 통해 타입에 맞는 객체로 변환된다.

 

특징

- @RequestBody를 사용하면 요청 본문의 JSON, XML, Text 등의 데이터가 적합한 HttpMessageConverter를 통해

   파싱되어 Java 객체로 변환된다.

- @RequestBody를 사용할 객체는 필드를 바인딩할 생성자나 Setter 메서드가 필요 없다.

   * 직렬화를 위해 기본 생성자는 필수다.

   * 데이터 바인딩을 위한 필드명을 알아내기 위해 getter 도는 setter 중 1가지는 정의되어 있어야 한다.

 

예)

@RequestMapping(value="/test")
public void testController(@RequestBody TestVO testVO){
}

 

주의사항

View 에서 Ajax 를 통해 데이터를 넘길 경우 contentType 과 json 데이터의 문자열 파싱이 필요하다.

아래와 같이 넘길 json Object 에 대해 string 형으로 파싱하고 넘길 데이터에 대한 내용 설정을 위한

contentType 설정이 필요하다.

// {name: "obj", phone: "01011112222"}
let obj = new Object();
obj.name = "obj";
obj.phone = "01011112222";

$.ajax({
    url: controller mapping url,
    type : "POST",
    data : JSON.stringify(obj),
    dataType: "json",
    contentType: "application/json;charset=utf-8",
    success: function(data){
        console.log(data);
    }
})

 

@ModelAttribute

클라이언트가 보내는 HTTP 파라미터들을 특정 Java Object에 바인딩하는 것이다.

URL ? name=seq&number=2 와 같은 Query String 형태 혹은 요청 본문에 넘어오는 Form 형태의 데이터를

처리한다.

 

특징

- @ModelAttribute를 사용하면 HTTP 파라미터 데이터를 Java 객체에 매핑할 수 있다.

   * 객체의 필드에 접근해 데이터를 바인딩할 수 있는 생성자 혹은 setter 메서드가 필요하다.

- Query String(Get 방식 요청) 및 Form 형식이 아닌 데이터는 처리할 수 없다.

 

예)

// HTML
<form id="form_test">
    <input type="text" id="test1" name="test1"><br>
    <input type="text" id="test2" name="test2"><br>
    <input type="text" id="test3" name="test3"><br>
    <input type="text" id="test4" name="test4"><br>
</form>
<button type="button" id="insert" onclick="form_insert()">입력</button>

// Javascript
let form_insert() = function(){
    $.ajax({
        type: "POST",
        url: "/form/test",
        data: $("#form_test").serialize(),
        dataType: "html",
        success: function(result){
            console.log(result);
        }
    })
}

// Controller
@RequestMapping("/form/test")
public String formTest(@ModelAttribute("data") TestVO data){
    System.out.println("test : "+data.toString());
}

위와 같이 Form 태그 데이터들을 jquery 의 serialize 를 이용해 파리미터 형식으로 데이터를 넘긴다.

jquery serialize() 함수를 사용할 경우 데이터는 test1=123&test2=456&test3=789 형식으로 넘어간다.

 

이러한 데이터를 Controller 에서 ModelAttribute 어노테이션을 사용해 Model 형식으로 전달받는다.

728x90
반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.