Spring MVC에서 @ModelAttribute와 @RequestParam은 컨트롤러에서 요청 데이터를 바인딩하는 데 사용되지만, 사용 목적과 방식이 다릅니다. 각각의 차이점과 장단점을 정리해 보겠습니다.
@ModelAttribute vs @RequestParam 개념 비교| 구분 | @ModelAttribute | @RequestParam |
|---|---|---|
| 용도 | 객체의 필드에 요청 데이터를 바인딩 | 단일 파라미터 값을 바인딩 |
| 적용 대상 | POJO 객체 | 기본 데이터 타입 (String, int, boolean 등) |
| 요청 데이터의 출처 | GET, POST 요청의 query parameter, form-data | GET 요청의 query parameter, POST 요청의 form-data |
| 파라미터가 없을 경우 | 객체의 필드는 기본값(null 또는 기본형 0)으로 설정 | required = true가 기본값이며, 파라미터가 없으면 예외 발생 |
@ModelAttribute 예제@ModelAttribute는 요청 데이터를 객체에 바인딩하여 컨트롤러에서 처리할 수 있도록 합니다.
@Controller
@RequestMapping("/user")
public class UserController {
@PostMapping("/register")
public String registerUser(@ModelAttribute User user) {
// user 객체에 폼 데이터 자동 매핑
System.out.println(user.getName());
System.out.println(user.getAge());
return "success";
}
}
POST 요청)POST /user/register
Content-Type: application/x-www-form-urlencoded
name=John&age=25
User 객체가 생성되고, name="John", age=25 값이 자동으로 매핑됨 ✔ 객체 단위로 데이터 바인딩이 가능하여 코드가 간결해짐
✔ 다양한 필드 값을 한 번에 처리 가능 (객체 내부에 포함된 필드도 자동 바인딩)
✔ @InitBinder를 활용하여 커스텀 바인딩이 가능
❌ 필요 없는 필드까지 매핑될 수 있어 보안상 주의가 필요
❌ 기본 생성자가 필요하며, Setter 메서드가 있어야 자동 바인딩이 가능
❌ @RequestParam보다 속도가 약간 느릴 수 있음
@RequestParam 예제@RequestParam은 단일 값을 요청 파라미터에서 추출하여 컨트롤러 메서드에서 사용할 수 있도록 합니다.
@Controller
@RequestMapping("/user")
public class UserController {
@GetMapping("/info")
public String getUserInfo(@RequestParam String name, @RequestParam int age) {
// 개별 파라미터 값을 직접 받음
System.out.println(name);
System.out.println(age);
return "user-info";
}
}
GET 요청)GET /user/info?name=John&age=25
name = "John", age = 25로 컨트롤러 메서드의 개별 매개변수에 전달 ✔ 필요한 값만 받을 수 있어 보안 측면에서 더 유리
✔ 간단한 파라미터 처리에 적합
✔ required=false 옵션을 사용하면 필수 여부를 선택할 수 있음
❌ 많은 필드를 처리하려면 여러 개의 @RequestParam을 사용해야 하므로 코드가 지저분해질 수 있음
❌ 객체 단위로 처리할 수 없어 복잡한 요청 데이터 처리에는 부적합
@ModelAttribute vs @RequestParam 언제 사용할까?| 상황 | 추천 방식 |
|---|---|
| 여러 개의 필드를 포함한 객체 단위 데이터 처리 | @ModelAttribute |
단순한 요청 파라미터 (예: id=1, name=John) | @RequestParam |
| 폼 데이터를 객체로 자동 매핑해야 하는 경우 | @ModelAttribute |
| 특정 파라미터만 선택적으로 받고 싶은 경우 | @RequestParam |
@RequestParam이 더 적합합니다. @ModelAttribute가 더 적절합니다.