지금까지 컨트롤러에 검증을 일일이 검사했다면,
이번에는 이 검증을 한 곳에서 몰아서 해볼거다.
여기서 Validator
인터페이스를 이용한다.
인터페이스이므로 이를 상속받는 클래스를 만든다.
쉽게 말해 파라미터로 넘어오는 클래스가 아이템 타입과 같은지 검사하는 것이다.
isAssignableFrom
을 사용하는 이유는
item
의 자식 클래스가 들어올 경우에도 가능하도록 하는 것이다.
validate
는 target
과 errors
가 넘어온다.
Errors
의 자식이 bindingResult
이므로 errors
에 똑같이 추가를 할 수 있다.
끝
하지만, 이 또한 더 단순히 만들수 있다.
스프링이 자동으로 호출하도록 만들 수 있다.
webDateBinder
는 스프링의 파라미터 바인딩의 역할을 해주고 검증 기능도 내부에 포함한다.
이전 코드와 달리 어노테이션이 하나 더 추가된 것을 확인할 수 있다.
해당 컨트롤러에만 영향을 준다.
@Validated
는 검증기를 실행하라는 어노테이션이다.
이 어노테이션이 붙으면 앞서 WebDateBinder
에 등록한 검증기를 찾아서 실행한다. 그런데 여러 검증기를 등록한다면 그 중에 어떤 검증기가 실행되어야 할지 구분이 필요하다. 이때 supports()
가 사용된다. 여기서는 supports(Item.class)
가 호출되고, 결과가 true
이므로 ItemValidator
의 validate()
가 호출된다.
package hello.itemservice;
import hello.itemservice.web.validation.ItemValidator;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@SpringBootApplication
public class ItemServiceApplication implements WebMvcConfigurer {
public static void main(String[] args) {
SpringApplication.run(ItemServiceApplication.class, args);
}
@Override
public Validator getValidator() {
return new ItemValidator();
}
}
이렇게 하면 글로벌 설정을 추가할 수 있다. 모든 컨트롤러에 @Validated
어노테이션을 붙이면 호출된다.
WebDataBinder
가 호출될때마다 새로 생성되는데 그 WebDataBinder
를 오버라이드 한다고 생각하면 된다.
위와 같이 글로벌 설정을 하면 @InitBinder
를 제거해도 정상 동작을 한다.
그런데 글로벌 설정을 하면 Bean Validator
가 자동 등록되지 않는다. 그리고 글로벌 설정을 직접 사용하는 경우는 드물다.
또, @Validated
, @Valid
둘다 사용가능하다.
이 부분은 Bean Validator
에서 자세히 다룰 예정이다.