[Spring] @RequestParam, @RequestBody, @ModelAttribute 차이

kiteB·2021년 11월 7일
0

Spring

목록 보기
3/3
post-custom-banner

Spring에서는 클라이언트로부터 받은 요청을 바인딩할 때 @RequestParam, @RequestBody, @ModelAttribute 등을 사용한다.

오늘은 세 가지 어노테이션에 대해 자세히 알아보고, 차이점도 비교해보려고 한다.


1. @RequestParam

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

예제

@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://mangkyu.tistory.com/72?category=761302
https://www.baeldung.com/spring-request-param
https://tecoble.techcourse.co.kr/post/2021-05-11-requestbody-modelattribute/
https://parkadd.tistory.com/70

profile
🚧 https://coji.tistory.com/ 🏠
post-custom-banner

0개의 댓글