Validator 분리

3852 단어 검증검증

이렇게 컨트롤러가 많은 일을 하는 코드가 나쁜 코드라는 것을 우린 이미 알고 있다!

이런 경우 별도의 클래스로 역할을 분리하는 것이 좋다.
그리고 이렇게 분리한 검증 로직을 재사용 할 수도 있다.

그러기 위한 Validator를 분리 해보자

Validator

스프링은 체계적인 검증 로직을 위한 Validator 인터페이스를 제공한다

public interface Validator {
    boolean supports(Class<?> clazz);
    void validate(Object target, Errors errors);
}
  • boolean supports(Class<?> clazz) : 검증기에 들어온 클래스가 검증기에서 지원하는 클래스 인지 확인한다.
  • void validate(Object target, Errors errors) : 검증 로직, 검증 대상 객체와 BindingResult

WebDataBinder

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

@InitBinder
public void init(WebDataBinder dataBinder) {
    dataBinder.addValidators(itemValidator);
}

이렇게 WebDataBinder 에 검증기를 추가하면 해당 컨트롤러에서는 검증기를 자동으로 적용할 수 있다.
@InitBinder가 있는 컨트롤러에만 영향을 주며, 글로벌 설정이 필요하면 따로 해줘야한다.

동작 방식

public String addItemV6(@Validated @ModelAttribute Item item, 
			BindingResult bindingResult, 
			RedirectAttributes redirectAttributes, 
			Model model) {
		
		...
}

@Validated 는 검증기를 실행하라는 애노테이션이다.
이 애노테이션이 붙으면 앞서 WebDataBinder 에 등록한 검증기를 찾아서 실행한다.
그런데 여러 검증기를 등록한다면 그 중에 어떤 검증기가 실행되어야 할지 구분이 필요하다.
이때 supports() 가 사용된다.

참고

검증시 @Validated @Valid 둘다 사용가능하다.
javax.validation.@Valid 를 사용하려면 build.gradle 의존관계 추가가 필요하다.
implementation 'org.springframework.boot:spring-boot-starter-validation'
@Validated 는 스프링 전용 검증 애노테이션이고, @Valid 는 자바 표준 검증 애노테이션이다.

좋은 웹페이지 즐겨찾기