스프링이 제공하는 검증 오류 처리 방법, BindingResult , @Validated
@Validated
spring-boot-starter-validation 라이브러리를 넣으면
스프링 부트는 LocalValidatorFactoryBean 을 글로벌 Validator로 등록한다.
이 Validator는 @NotNull 같은 애노테이션을보고 검증을 수행한다.
@PostMapping("/add")
public String addItem(@Validated @ModelAttribute Item item, BindingResult bindingResult) {
~
}
이렇게 글로벌 Validator가 적용되어 있기 때문에, @Valid , @Validated 만 적용하면 된다.
검증 오류가 발생하면, FieldError , ObjectError 를 생성해서 BindingResult 에 담아준다.
BindingResult
검증 오류를 보관하는 객체이다. 검증 오류가 발생하면 여기에 보관하면 된다
필드에 오류가 있으면 FieldError객체를 생성해서 bindingResult에, 특정 필드를 넘어서는 오류가 있으면 ObjectError객체를 생성해서 bindingResult에 담는다
BindingResult 는 Model에 자동으로 포함된다.
@PostMapping("/add")
public String addItem(@Validated @ModelAttribute Item item, BindingResult bindingResult) {
~
}
BindingResult bindingResult 파라미터의 위치는 @ModelAttribute Item item 다음에 와야 한다.
( BindingResult 는 검증할 대상 바로 다음에 와야한다 )
BindingResult 가 있으면 @ModelAttribute에 데이터 바인딩 시 오류가 발생해도 컨트롤러가 호출된다
BindingResult 가 없으면 400 오류가 발생하면서 컨트롤러가 호출되지 않고, 오류 페이지로 이동한다.
BindingResult 가 있으면 오류 정보( FieldError )를 BindingResult 에 담아서 컨트롤러를 정상 호출한다
public interface BindingResult extends Errors { ~ }
Errors 인터페이스는 단순한 오류 저장과 조회 기능을 제공
실제 넘어오는 구현체는 BeanPropertyBindingResult
타임리프와 통합
타임리프는 스프링의 BindingResult 를 활용해서 편리하게 검증 오류를 표현하는 기능을 제공
#fields 로 BindingResult 가 제공하는 검증 오류에 접근
th:errors : 해당 폼 필드에 대한 유효성 검사 오류가 있을 때 그 오류 메시지를 출력
th:errorclass : th:field 에서 지정한 필드에 오류가 있으면 class 정보를 추가