개발/Spring

Spring @RequestParam @RequestBody @ModelAttribute 차이

JangHC 2022. 3. 20. 02:10

 

1. @RequestParam

1개의 HTT 요청 파라미터를 받기 위해서 사용한다.

예제

@GetMapping("/api/foos")
@ResponseBody
public String getFoos(@RequestParam String id) {
    return "ID: " + id;
}
  • @RequestParam을 이용해서 id 쿼리 매개변수를 추출한다.

속성

1. name

  • 위의 예제에서는 변수 이름과 매개변수 이름이 동일한데, 이를 다르게 설정할 수도 있다.
@PostMapping("/api/foos")
@ResponseBody
public String addFoo(@RequestParam(name = "id") String fooId, @RequestParam String name) { 
    return "ID: " + fooId + " Name: " + name;
}
  • 매개변수 앞에 @RequestParam(name = "id")를 추가해주면 된다.

2. required & defaultValue

  • @RequestParam은 요청에 매개변수가 필수적이다. → @RequestParam(required = true)가 기본 설정이다.
    • 해당 파라미터가 전송되지 않으면 400 Error을 반환한다.
  • @RequestParam(required = false)로 설정하면 파라미터가 없어도 된다. → 이 경우 매개변수가 null로 바인딩된다.
  • defaultValue를 통해 기본값을 설정할 수도 있다.
@GetMapping("/api/foos")
@ResponseBody
public String getFoos(@RequestParam(required = false, defaultValue = "0") String id) {
    return "ID: " + id;
}

 

2. @RequestBody

클라이언트가 전송하는 Json(application/json) 형태의 HTTP Body 내용을 Java Object로 변환해준다.

  • 그렇기 때문에 Body가 존재하지 않는 Get 메소드에서 사용하면 에러가 발생한다.
  • HTTP 요청 본문 데이터는 Spring에서 제공하는 HttpMessageConverter를 통해 타입에 맞는 객체로 변환된다.
  • @RequestBody를 사용할 객체는 필드를 바인딩할 생성자나 setter 메서드가 필요 없다.

3. @ModelAttribute

클라이언트가 전송하는 multipart/form-data 형태의 HTTP Body 내용과 HTTP 파라미터 데이터를 Setter를 통해 Java 객체에 매핑한다.

  • 객체의 필드에 접근해서 데이터를 바인딩할 수 있는 생성자 혹은 setter 메서드가 필요하다.
  • Query String 및 Form 형식이 아닌 데이터는 처리할 수 없다.

 

📌 정리

  • RequestParam
    • 1개의 HTTP 파라미터를 얻기 위해 사용한다.
    • 매개변수가 필수적으로 필요하다.
      • 매개변수가 전달되지 않은 경우 400 에러가 발생한다.
      • 설정을 통해 바꿀 수 있다.
  • RequestBody
    • Json으로 받은 HTTP Body 데이터를 HttpMessageConverter를 통해 변환한다.
    • setter가 없어도 된다.
  • ModelAttribute
    • multipart/form-data 형태의 HTTP Body 내용과 HTTP 파라미터들을 Setter를 통해 1대 1로 객체에 바인딩시킨다.
    • 매개변수의 바인딩을 받는 필드는 setter 함수가 있어야 한다.

 

출저 : https://velog.io/@mmy789/Spring-RequestParam-RequestBody-ModelAttribute-%EC%B0%A8%EC%9D%B4