Validation - Validator 분리

지금까지 컨트롤러에 검증을 일일이 검사했다면,

이번에는 이 검증을 한 곳에서 몰아서 해볼거다.

여기서 Validator 인터페이스를 이용한다.

Validatior

인터페이스이므로 이를 상속받는 클래스를 만든다.

supports

쉽게 말해 파라미터로 넘어오는 클래스가 아이템 타입과 같은지 검사하는 것이다.

isAssignableFrom을 사용하는 이유는
item의 자식 클래스가 들어올 경우에도 가능하도록 하는 것이다.

validate

validatetargeterrors가 넘어온다.

Errors의 자식이 bindingResult 이므로 errors에 똑같이 추가를 할 수 있다.

하지만, 이 또한 더 단순히 만들수 있다.
스프링이 자동으로 호출하도록 만들 수 있다.

WebDataBinder 사용하기

webDateBinder는 스프링의 파라미터 바인딩의 역할을 해주고 검증 기능도 내부에 포함한다.

이전 코드와 달리 어노테이션이 하나 더 추가된 것을 확인할 수 있다.

@InitBinder

해당 컨트롤러에만 영향을 준다.

@Validated

@Validated는 검증기를 실행하라는 어노테이션이다.
이 어노테이션이 붙으면 앞서 WebDateBinder에 등록한 검증기를 찾아서 실행한다. 그런데 여러 검증기를 등록한다면 그 중에 어떤 검증기가 실행되어야 할지 구분이 필요하다. 이때 supports()가 사용된다. 여기서는 supports(Item.class)가 호출되고, 결과가 true이므로 ItemValidatorvalidate()가 호출된다.

글로벌 설정 - 모든 컨트롤러에 다 적용

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에서 자세히 다룰 예정이다.

좋은 웹페이지 즐겨찾기