스프링
@ModelAttribute
gilssang97
2021. 9. 20. 20:09
@ModelAttribute 사용
@ModelAttribute는 사용자가 전달하는 값을 오브젝트 형태(객체 형태)로 매핑해주는 어노테이션이다.
보통 폼을 통해 값을 전달할 때 자주 사용한다.
설명하기에 앞서, 오브젝트 형태(객체 형태)로 매핑해주어야 하기 때문에 임의의 객체인 Person을 다음과 같이 구성하였다.
@Getter
@Setter
@RequiredArgsConstructor
public class Person {
private String name;
private Integer age;
}
(1) @ModelAttribute 애노테이션 사용
@Slf4j
@Controller
public class request_mapping {
@RequestMapping("/request_mapping")
public String visit(@ModelAttribute Person person, Model model) {
model.addAttribute("person", person);
return "home";
}
}
- Form 객체를 통해 얻어진 name과 age 파라미터를 Person 객체의 name과 age에 매핑시켜 값을 리턴한다.
(2) @ModelAttribute 애노테이션 생략
@Slf4j
@Controller
public class request_mapping {
@RequestMapping("/request_mapping")
public String visit(Person person, Model model) {
model.addAttribute("person", person);
return "home";
}
}
- Form 객체를 통해 얻어진 name과 age 파라미터를 Person 객체의 name과 age에 매핑시켜 값을 리턴한다.
생략 시, @RequestParam vs @ModelAttribute
@RequestParam을 알아보기 위해 RequestParamMethodArgumentResolver를 살펴보고 @ModelAttribute를 알아보기 위해 ModelAttributeMethodProcessor을 살펴보자.
(1) @RequestParam
- @RequestParam의 경우에는 심플 타입일 경우에 사용이 된다.
- 심플 타입이란 우리가 흔히 사용하는 원시타입(Integer, String 등)등을 말한다.
(2) @ModelAttribute
- 심플 타입이 아닌경우 즉, 복합 타입(클래스)일 경우 추가적으로 Argument Resolver에 등록되어 있지 않은 경우에 @ModelAttribute가 사용된다.
@ModelAttribute 파라미터
(1) name
@Slf4j
@Controller
public class request_mapping {
@RequestMapping("/request_mapping")
public String visit(@ModelAttribute(name="person") Person person) {
return "home";
}
}
<div th:object="${person}">
<p th:text="|이름은 *{name}입니다.|"></p>
<p th:text="|나이는 *{age}입니다.|"></p>
</div>
- @ModelAttribute의 경우, Model에 자동으로 저장이 된다.
- 이 때, Model의 attributeName을 설정하는데 name을 사용한다.
(2) value
@Slf4j
@Controller
public class request_mapping {
@RequestMapping("/request_mapping")
public String visit(@ModelAttribute(name = "person", value = "person") Person person) {
return "home";
}
}
- 이름을 부여한다.
(3) binding
@Slf4j
@Controller
public class request_mapping {
@RequestMapping("/request_mapping")
public String visit(@ModelAttribute(name = "person", binding = false) Person person) {
return "home";
}
}
- 바인딩의 여부를 정한다.
- default는 true이다.
name 속성 이외에는 크게 사용할 일이 없다.