새소식

반응형
Java/Spring

@RequestBody, @RequestParam, @RequestPart

  • -
반응형


@RequestBody

HTTP 요청으로 넘어오는 Body 의 내용을 HttpMessageConverter 를 통해 Java Object로 역직렬화한다.

바이너리 파일을 포함하고 있지 않은 데이터를 받는 역할을 한다.

 

* HttpMessageConverter

: HTTP 요청과 응답에 대해서 "전략 패턴"을 사용해 Converting 해주는 역할

 

@RequestBody 어노테이션은 HTTP 요청으로 같이 넘어오는 Header 의 Content-Type을 보고

어떤 Converter 를 사용할지 정하므로 Content-Type 은 반드시 명시해야한다.

 

자주쓰는 Content-Type 종류

  • application/json : { key : value } 형태인 json 형태로 전송
  • application/x-www-form-urlencoded : name=obo&number=123456 형태인 쿼리 스트링 형태로 전송
  • multipart/form-data : 파일 업로드시 사용되며, 파일을 포함한 여러 데이터가 part(쪼개서) 형식으로 나눠서 전송

 

// javascript
let json = new Object();
json.name = 'obo';
json.number = '01011112222';

// 형식 - { name : 'obo', number : '01011112222' }

$.ajax({
    type: 'POST'    
    url: '/main',
    dataType: 'json',
    contentType: 'application/json',
    data: JSON.stringify(json),
    success: function(result){
        console.log(result);
    }
})

// model
public class TestModel {
    String name;
    String number;
    ...getter
    ...setter
    ...toString
}

// java Controller
@RequestMapping(value="/main")
@ResponseBody
public String main(@RequestBody TestModel model){
    system.out.println("model : "+model.toString());
    // 결과
    // TestModel { "name" : "obo", "number" : "01011112222" }
    return "";
}

 

@RequestParam

HTTP 요청에서 하나의 파라미터를 받을 때 사용한다. 기본적으로 파라미터가 필수적으로

들어오게 설정되어 있기 때문에 파라미터가 들어오지 않을 경우 에러가 발생할 수 있다.

들어오지 않을수도 있다면 @RequestParam 의 required 설정을 false 로 설정한다.

 

@RequestParam 또한 @RequestPart 와 같이 MultipartFile 을 받을 때 사용할 수 있다.

 

@RequestPart 와 다른점은 @RequestParam 의 경우 파라미터가 String 이나 MultipartFile 이 아닌경우

Converter 나 PropertyEditor 에 의해 처리 된다.

하지만 @RequestPart 는 HttpMessageConverter 가 Content-Type 을 참고하여 알맞는 Converter 로

처리한다.

 

MultipartFile 을 여러개로 받기 위해선 List<MultipartFile>  형태로 받을 수 있으며,

모든 파라미터를 Map<String, Object> 처럼 한번에 받을 수 있으나 유지보수성이 떨어진다.

많은 데이터를 주고 받을 때는 @RequestBody 와 DTO 를 이용하는 편이 좋다.

 

아래 데이터를 보면 Content-Type 이 "application/x-www-form-urlencoded" 인 경우는 form 태그 형식의 쿼리 스트링 형식으로 데이터를 하나하나 날린다. ex) ?name=123&number=123123

// javascript
let json = "name=obo&number=01011112222";

$.ajax({
    type: 'POST'    
    url: '/main',
    dataType: 'json',
    contentType: 'application/x-www-form-urlencoded',
    data: json,
    success: function(result){
        console.log(result);
    }
})

// java Controller
@RequestMapping(value="/main")
@ResponseBody
public String main(
      @RequestParam("name") String name,                             
      @RequestParam("number") String number
){
    system.out.println("name: "+name);    system.out.println("number: "+number);
    // 결과    // name: obo
    // number: 01011112222
    return "";
}

 

@RequestPart

Content-Type 이 'multipart/form-data' 에 특화된 어노테이션이다.

MultipartFile 이 포함되는 경우에 MultipartResolver가 동작하여 역직렬화를 하게 된다.

MultipartFile 이 포함되지 않는 경우에 @RequestBody 와 같이 HttpMessageConverter가 동작된다.

 

아래는 fileList 에 파일이 2개 있다고 가정한 후에 FormData Object 를 생성하고 데이터를 전달한다.

processData 는 기본적으로 true 가 되어 있는데 쿼리 스트링형태로 데이터를 날린다.

쿼리스트링 형태로 데이터를 날리지 않기 때문에 false 를 설정한다.

let formData = new FormData();

formData.append('b_title', $("#boastTitle").val());
formData.append('server_seq', $("#server_seq").val());
formData.append('b_content', b_content);

fileList.forEach((data, index) => {
    formData.append('file', data);
});

$.ajax({
    url: contextPath + "/boast/ins/submit",
    type: "POST",
    data: formData,
    processData: false,
    contentType: false,
    success: function(result) {

    }
})

 

반응형
Contents

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

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