김영한님 인강듣고/스프링 MVC

스프링이 제공하는 검증 오류 처리 방법, BindingResult , @Validated

doriver 2024. 8. 17. 12:05

@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 정보를 추가