개발하는 자몽

[Spring MVC] Model, @ModelAttribute 본문

Java/Spring

[Spring MVC] Model, @ModelAttribute

jaamong 2022. 9. 10. 18:27

Model@ModelAttribute에 대해서 정리가 필요한 것 같아서 글을 쓴다.

 

 

Model

Model은 객체다. HashMap 형태로 Controller에서 view에 필요한 데이터를 key, value로 넣어준다. key는 객체의 이름(view의 이름), value는 객체를 담는다. 넣어진 값은 view의 이름과 view를 렌더링 할 때 필요하다. Servlet의 request.setAttribute()와 비슷한 역할을 한다.(둘은 똑같지 않다. https://velog.io/@dbsrud9126/Spring-Model.addAttribute-vs-Request.setAttribute)

@PostMapping("/add")
public void add(@RequestParam String name, 
		@RequestParam Integer price,
                Model model) {
	
    Item item = new Item();
    item.setName(name);
    item.setPrice(price);
    
    itemRepository.save(item);
    
    model.addAttribute("item", item); // model에 item 객체를 담는다.
}

 

@ModelAttribute

@ModelAttribute는 아래 두 가지를 같이 처리해준다.

  • 모델 객체 생성
  • 생성한 모델 객체를 뷰에 삽입
@PostMapping("/add")
public void add(@ModelAttribute("item") Item item) {
	itemRepository.save(item);
}

@ModelAttribute를 사용하면 @RequestParam으로 값을 받아 setter로 객체에 값을 넣는 과정이 자동화된다. 또한 model.addAttribute(key, value)까지 처리해준다. 즉, @ModelAttribute("itemA")이라고 하면 model.addAttribute("itemA",...)라고 담긴다.

 

@ModelAttribute의 이름 속성은 생략이 가능하다. 생략 시 클래스 명에서 첫 글자가 소문자로 치환되어 model.addAttribute에 담긴다.

@PostMapping("/add")
public void add(@ModelAttribute Item item) { //이름 속성 생략
	itemRepository.save(item);
//	model.addAttribute("item", item);	//Item 클래스의 첫 글자가 소문자로 치환되어 담긴다.
}

 

또한 @ModelAttribute도 생략이 가능하다.

@PostMapping("/add")
public void add(Item item) { //@ModelAttribute 생략
	itemRepository.save(item);
}

이 경우 마찬가지로 생략가능한 @RequestParam과 혼동될 수 있으니 아래를 참고하자.

  • @RequestParam : String, int, Integer 같은 단순 타입
  • @ModelAttribute : 나머지 (argument resolver로 지정해둔 타입 외)

 

 

 

 

 

참고

 

Spring MVC [ Model / @ModelAttribute]

spring을 공부하다 보니까 Model이랑 @ModelAttribute가 너무 많이 나와서 한번 정리 좀 하고 싶어서 글 쓰게 됐다... Model이랑 @ModelAttribute랑 다르지만 자꾸 헷갈려서ㅋㅋㅋㅋㅋㅠㅠ 💜 Model 💜 Model은

dahliachoi.tistory.com

'Java > Spring' 카테고리의 다른 글

@SpringBootTest, @TestConfiguration  (0) 2022.09.24
[트랜잭션] @Transactional AOP  (0) 2022.09.23
[Spring MVC] 뷰 템플릿, 템플릿 엔진, thymeleaf  (0) 2022.09.08
프록시(Proxy)  (0) 2022.08.13
Dependency LookUp  (0) 2022.08.12
Comments