Validator 분리

Jaca·2021년 11월 1일
0

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

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

그러기 위한 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 는 자바 표준 검증 애노테이션이다.

profile
I am me

0개의 댓글

관련 채용 정보