지난 포스팅에서 @ModelAttribute에 대해서 알아보았다. @ModelAttribute는 Get이나 Post 방식으로 들어온 Request 데이터를 특정 객체에 담아 파라미터로 넘겨받는 어노테이션이다.
@ModelAttribute 파라미터 선언
@PostMapping("/add")
public String addItemV1(@ModelAttribute Item item, Model model){
itemRepository.save(item);
model.addAttribute("item", item);
return "basic/item";
}
@ModelAttribute에는 Model 객체에 addAttribute하는 과정을 자동화하는 기능이 있다. 그래서 위 코드처럼 model.addAttribute 메소드를 직접 호출 안해줘도 Spring이 자동으로 해준다.
@PostMapping("/add")
public String addItemV2(@ModelAttribute("item") Item item){
itemRepository.save(item);
return "basic/item";
}
@ModelAttribute에 value 값으로 "item"을 넣으면, Spring은 자동으로 Model 객체에 "item"을 key로 하여 item 객체를 등록한다. 다시 말하여, 자동으로 model.addAttribute("item", item); 을 실행한다. 그러므로 Controller에는 Model 관련 코드를 작성하지 않아도 된다.
@PostMapping("/add")
public String addItemV3(@ModelAttribute Item item){
itemRepository.save(item);
return "basic/item";
}
그런데 굳이 value값을 넣지 않아도 Spring이 Item(클래스 타입명)의 앞문자를 소문자로 바꾼 "item"을 key명으로 하여 Model에 추가한다.
@PostMapping("/add")
public String addItemV4(Item item){ //@ModelAttribute도 생략가능
itemRepository.save(item);
return "basic/item";
}
더 단순하게는 @ModelAttribute를 생략해도 된다. 원래 @ModelAttribute가 없는데 파라미터로 클래스 타입이 오면, Spring이 자동으로 GET이나 POST 방식으로 들어온 데이터를 담은 객체를 생성하여 넘긴다. 동시에 Model에도 추가를 하는 것이다.
@ModelAttribute의 메소드 선언
@ModelAtttibute는 파라미터 뿐만 아니라 메소드에도 선언이 가능하다.
@Controller
@RequestMapping("/form/items")
@RequiredArgsConstructor
public class FormItemController {
private final ItemRepository itemRepository;
@ModelAttribute("regions") // @ModelAttribute 메소드에 선언
public Map<String,String> regions(){
Map<String,String> regions = new LinkedHashMap<>();
regions.put("SEOUL","서울");
regions.put("BUSAN","부산");
regions.put("JEJU","제주");
return regions;
}
@ModelAttribute //@ModelAttribute 메소드에 선언
public void setAttributes(Model model) {
model.addAttribute("key", "value");
}
@GetMapping
public String items(Model model) {
List<Item> items = itemRepository.findAll();
model.addAttribute("items", items);
return "form/items";
}
}
@ModelAttribute에 설정된 value값을 key값으로, 메소드의 반환값을 value로 하여 Model 객체에 추가한다. 그럼 어떤 Model에 추가할까? Controller에 선언된 모든 메소드의 Model에 공통으로 추가된다. @ModelAttribute가 선언된 메소드는 Controller의 메소드가 실행되기 전에 먼저 실행되어 Model에 미리 추가해놓는다. @ModelAttribute는 여러 개 선언되어도 되고 반환타입 없이 Model을 파라미터로 받아 설정해도 된다.
참고자료
'SPRING > Spring MVC' 카테고리의 다른 글
[SpringMVC] 검증(Validation)(1) - HashMap (0) | 2023.08.22 |
---|---|
[SpringMVC] PRG ( Post/Redirect/Get ) (0) | 2023.08.18 |
[SpringMVC] HTTP 메시지 컨버터 동작원리 (0) | 2023.08.15 |
[SpringMVC] HTTP 응답 - Controller 반환타입 (0) | 2023.08.14 |
[SpringMVC] HTTP 요청 메시지 - TEXT, JSON (0) | 2023.08.12 |