Spring MVC [ Model / @ModelAttribute]
spring을 공부하다 보니까 Model이랑 @ModelAttribute가 너무 많이 나와서 한번 정리 좀 하고 싶어서 글 쓰게 됐다...
Model이랑 @ModelAttribute랑 다르지만 자꾸 헷갈려서ㅋㅋㅋㅋㅋㅠㅠ
💜 Model 💜
- Model은 객체이다.
- view의 이름과 view를 렌더링할 때 필요하다.
- map으로 되어있기 때문에 controller에서 view에 필요한 데이터를 key, value로 넣어준다.
- Servlet에서 request.setAttribute()와 비슷한 역할을 한다.
- model객체에 담을 때는 model.addAttribute("key", value)를 사용하면 된다.
💜 @ModelAttribute 💜
요청 파라미터를 받아서 필요한 객체를 만들고 그 객체에 값을 넣어주어야 한다.
보통 @RequestParam을 사용해서 값을 받고, set을 사용해서 값을 넣어주곤 하지만 이 과정을 자동화시켜주는 것이 @ModelAttribute이다.
👉 @ModelAttribute를 사용하지 않을 때 (model도 같이 사용해보기)
public void item(@RequestParam String name,
@RequestParam int price,
Model model){
Item item = new Item();
item.setName(name);
item.setPrice(price);
model.addAttribute("item", item);
}
이렇게 @RequestParam으로 일일이 받아서 set을 해줘야 값이 저장된다. 하지만 @ModelAttribute를 사용하면 간단해진다.
👉 modelAttribute 사용
public void modelAttributeEx(@ModelAttribute Item item, Model model){
model.addAttribute("item", item);
}
이렇게 간결하게 사용 가능하다.
@ModelAttribute가 실행되는 원리를 설명하자면 요청 파라미터의 이름으로 Item 객체의 프로퍼티를 찾는다.
해당 프로퍼티의 setter를 호출해서 파라미터 값을 입력한다.
하지만 저기에서 model.addAttribute도 생략 가능하다. @ModelAttribute를 사용함으로써 model에도 자동적으로 객체가 추가 되기 때문이다.
➕ @ModelAttribute 어노테이션도 생략가능하다.
public void ModelAttributeEx(Item item, Model model){}
그럼 최종적으로 이런 모양이 된다!!
✍ 생략할 경우 주의할 점
@RequestParam과 @ModelAttribute모두 생략 가능한 어노테이션이다.
하지만 @RequestParam을 생략할 때는 String이나 int 같은 단순 타입을 사용할 때이고, 객체 같은 나머지를 사용할 때는 @ModelAttribute가 생략되었다고 생각하면 된다.