해당 포스팅에서는 @ModelAttribute에 대해 간략하게 정리해 보고자 한다.
@ModelAttribute가 있으면 Model 객체에 해당 이름으로 데이터를 자동으로 추가한다. 즉, model.addAttribute("item", item); 로직이 자동으로 붙는다.
@PostMapping("/add")
public String addItem(@ModelAttribute Item item) {
// model.addAttribute("item", item);
...
}
@ModelAttribute 괄호 안에 입력한 문자열의 이름으로 Model 객체에 저장된다. 만약 괄호를 생략할 시에는 객체 이름 그대로 앞 글자만 소문자로 바꿔서 Model 객체에 저장된다.
public String Ex1(@ModelAttribute ItemSaveForm form) {
// model.addAttribute("itemSaveForm", form)
}
public String Ex2(@ModelAttribute("test") ItemSaveForm form) {
// model.addAttribute("test", form)
}
@ModelAttribute도 @RequestParam과 같이 생략할 수 있는데, @RequestParam도 생략이 가능하기 때문에 혼란이 발생할 수 있다. 생략 시 스프링은 다음과 같은 규칙을 적용한다:
@ModelAttribute는 폼 데이터를 객체로 바인딩하는 데 유용하다. 이를 통해 복잡한 폼 데이터를 쉽게 처리할 수 있다.
@PostMapping("/register")
public String registerUser(@ModelAttribute UserForm userForm) {
// model.addAttribute("userForm", userForm);
userService.save(userForm);
return "registrationSuccess";
}
@ModelAttribute 메서드를 사용하여 컨트롤러 메서드 호출 전에 모델에 데이터를 추가할 수 있다. 이를 통해 뷰에서 폼 초기값을 설정할 수 있다.
@Controller
public class UserController {
@ModelAttribute("user")
public UserForm setUpUserForm() {
return new UserForm();
}
@GetMapping("/register")
public String showRegistrationForm() {
return "registerForm";
}
}
@ModelAttribute는 컨트롤러의 여러 메서드에서 공통적으로 사용되는 데이터를 뷰와 공유할 때 유용하다. 이를 통해 중복 코드를 줄일 수 있다.
@Controller
public class GlobalController {
@ModelAttribute("categories")
public List<String> populateCategories() {
return List.of("Category1", "Category2", "Category3");
}
@GetMapping("/products")
public String showProducts() {
return "productList";
}
@GetMapping("/services")
public String showServices() {
return "serviceList";
}
}
@ModelAttribute와 @RequestParam 차이
- @ModelAttribute
- 주로 객체에 폼 데이터를 바인딩할 때 사용된다.
- 객체를 생성하고 자동으로 모델에 추가한다.
public String addItem(@ModelAttribute Item item) { // model.addAttribute("item", item); ... }
- @RequestParam:
- 주로 단순한 타입의 요청 파라미터를 받을 때 사용된다.
- URL 쿼리 파라미터 또는 폼 데이터를 변수에 바인딩한다.
public String addItem(@RequestParam String name, @RequestParam int quantity) { ... }