Spring MVC 핸들러 메소드 @ModelAttribute
Spring Web MVC
백기선님의 강의인 Spring Web MVC 강의를 듣고 공부한 내용을 정리한 글
@ModelAttribute
@ModelAttribute는 여러 곳에 있는 단순 데이터 타입을 복합 타입 객체로 받아오거나 해당 객체를 새로 만들 때 사용할 수 있다.
여러곳이라 함은 URI 패스, 요청 매개변수, 세션 등을 의미한다.
복합 객체에 데이터를 바인딩하는 방법은 반드시 Request Parameter로만 전달되어야하는 것은 아니다.
유연하게 여러 데이터를 하나의 복합 타입 객체로 받아올 수 있다.
만약 값을 바인딩 할 수 없는 경우라면 BindException이 발생하고 400에러가 발생한다.
만약 바인딩 에러를 직접 다루고 싶은 경우라면 @ModelAttribute가 붙은 메소드 아규먼트 옆에 BindingResult를 추가하면 된다.
@Controller
public class SampleController {
@PostMapping("/events/name/{name}")
@ResponseBody
public Event getEvent(@ModelAttribute Event event, BidingResult bidingResult) {
if(bindingResult.hasErrors()){
bindingResult.getAllErrors().forEach( c-> {
System.out.println(c.toString());
});
}
return event;
}
}
바인딩 이후 검증 작업을 추가로 검증하고 싶다면 @Valid 또는 @Validated 애노테이션을 사용할 수 있다.
public class Event {
private Integer id;
private String name;
@Min(0)
private Integer limit;
// getter & setter
...
}
```java
@Controller
public class SampleController {
@PostMapping("/events/name/{name}")
@ResponseBody
public Event getEvent(@Valid @ModelAttribute Event event, BidingResult bidingResult) {
if(bindingResult.hasErrors()){
bindingResult.getAllErrors().forEach( c-> {
System.out.println(c.toString());
});
}
return event;
}
}
@Validated
스프링 MVC 핸들러 메소드 아규먼트에 사용할 수 있으며 validation group이라는 힌트를 사용할 수 있다.
@Valid 애노테이션에는 그룹을 지정할 방법이 없다.
@Validated는 스프링이 제공하는 애노테이션으로 그룹 클래스를 설정할 수 있다.
Reference
인프런 백기선님의 스프링 Web MVC