Spring

Spring MVC [ Model / @ModelAttribute]

DAHLIA CHOI 2021. 8. 26. 21:18

 

 

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가 생략되었다고 생각하면 된다.