
@ModelAttribute
예시 코드)
/**
* Form으로부터 받아온 item을 저장한 후, item 정보를 보여주는 뷰 반환
*/
@PostMapping("/add")
public String addItem(@ModelAttribute("item") Item item, Model model) {
itemRepository.save(item);
model.addAttribute("item", item); // @ModelAttribute -> 자동으로 Model에 추가, 생략 가능
return "basic/item";
}
@ModelAttribute 어노테이션은 HTTP 요청 파라미터들을 1:1로 하나의 객체에 바인딩할 때 사용한다.
@RequestParam으로 바인딩하기에는 파라미터들이 너무 많을 때, @ModelAttribute를 사용하면 이를 하나의 객체로 압축시킬 수 있다.
- String, int, Integer와 같은 단순한 타입 -> @RequestParam
- 그 외 (단순한 타입들의 묶음) -> @ModelAttribute
단, 객체에 기본 생성자, 객체의 프로퍼티 각각에 대한 Setter가 있어야 바인딩이 가능하다. (혹은 매개변수가 있는 생성자)
그 이유는 @ModelAttribute를 처리하는 과정에서 알 수 있다.
- Item 객체를 생성한다. -> 기본 생성자 사용
- 요청 파라미터의 이름으로 Item 객체의 프로퍼티를 찾고, 해당 프로퍼티의 setter를 호출해 바인딩한다. -> setter 사용
타이핑하기 귀찮다면, Lombok의 어노테이션들을 활용하자.
추가적으로, 요청 파라미터의 타입과 해당 프로퍼티의 타입이 일치하지 않는다면, 예외(BindingException)를 발생시킨다.
- ex) int 타입의 age라는 프로퍼티 -> 요청 파라미터로 "abc"라는 String 타입이 들어오는 경우(age=abc)
이러한 자동화된 요청 파라미터 바인딩이 가능하도록 Spring에서는 ArgumentResolver 라는 인터페이스를 제공한다.
ArgumentResolver에 대해서는 더 알아보고 새로운 게시글에서 다뤄보도록 하겠다.
RequestMapping - GET
GET 요청의 경우, URL의 쿼리 파라미터로 들어온 파라미터들의 이름을 key로, 짝지어진 value를 객체에 바인딩해준다.
RequestMapping - POST
POST 요청의 경우, <input> 등의 입력 태그의 "name" 필드 값을 key로, 짝지어진 value를 객체에 바인딩해준다.
- <input type="text" name="name"> <!-- 객체의 "name"이라는 이름의 프로퍼티에 value 바인딩 됨 -->
참고자료
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard
스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 인프런 | 강의
웹 애플리케이션을 개발할 때 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 MVC의 핵심 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., -
www.inflearn.com

@ModelAttribute
예시 코드)
/**
* Form으로부터 받아온 item을 저장한 후, item 정보를 보여주는 뷰 반환
*/
@PostMapping("/add")
public String addItem(@ModelAttribute("item") Item item, Model model) {
itemRepository.save(item);
model.addAttribute("item", item); // @ModelAttribute -> 자동으로 Model에 추가, 생략 가능
return "basic/item";
}
@ModelAttribute 어노테이션은 HTTP 요청 파라미터들을 1:1로 하나의 객체에 바인딩할 때 사용한다.
@RequestParam으로 바인딩하기에는 파라미터들이 너무 많을 때, @ModelAttribute를 사용하면 이를 하나의 객체로 압축시킬 수 있다.
- String, int, Integer와 같은 단순한 타입 -> @RequestParam
- 그 외 (단순한 타입들의 묶음) -> @ModelAttribute
단, 객체에 기본 생성자, 객체의 프로퍼티 각각에 대한 Setter가 있어야 바인딩이 가능하다. (혹은 매개변수가 있는 생성자)
그 이유는 @ModelAttribute를 처리하는 과정에서 알 수 있다.
- Item 객체를 생성한다. -> 기본 생성자 사용
- 요청 파라미터의 이름으로 Item 객체의 프로퍼티를 찾고, 해당 프로퍼티의 setter를 호출해 바인딩한다. -> setter 사용
타이핑하기 귀찮다면, Lombok의 어노테이션들을 활용하자.
추가적으로, 요청 파라미터의 타입과 해당 프로퍼티의 타입이 일치하지 않는다면, 예외(BindingException)를 발생시킨다.
- ex) int 타입의 age라는 프로퍼티 -> 요청 파라미터로 "abc"라는 String 타입이 들어오는 경우(age=abc)
이러한 자동화된 요청 파라미터 바인딩이 가능하도록 Spring에서는 ArgumentResolver 라는 인터페이스를 제공한다.
ArgumentResolver에 대해서는 더 알아보고 새로운 게시글에서 다뤄보도록 하겠다.
RequestMapping - GET
GET 요청의 경우, URL의 쿼리 파라미터로 들어온 파라미터들의 이름을 key로, 짝지어진 value를 객체에 바인딩해준다.
RequestMapping - POST
POST 요청의 경우, <input> 등의 입력 태그의 "name" 필드 값을 key로, 짝지어진 value를 객체에 바인딩해준다.
- <input type="text" name="name"> <!-- 객체의 "name"이라는 이름의 프로퍼티에 value 바인딩 됨 -->
참고자료
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard
스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 인프런 | 강의
웹 애플리케이션을 개발할 때 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 MVC의 핵심 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., -
www.inflearn.com