@Valid를 사용하는 방법
@Getter
@Setter
public class MemberForm {
@NotEmpty(message = "회원 이름은 필수 입니다.")
private String name;
@NotNull
private String city;
@NotNull
private String street;
@NotNull
private String zipcode;
}
@PostMapping("/members/new")
public String create(@Valid MemberForm form, BindingResult result){
...
return "redirect:/";
}
@Validated를 사용하는 방법
@Service
@Validated
public class Service {
public void add(@Valid Request request) {
...
}
}
동작 원리
1. 클라이언트에서 컨트롤러 호출
2. Dispatcher Servlet
에서 요청에 맞는 컨트롤러 탐색
3. RequestResponseBodyMethodProcessor
클래스의 resolverArgument
메소드 호출
4. AbstractMessageConverterMethodArgumentResolver
클래스의 validatIfApplicable
메소드 호출
5. ValidationAnnotationUtils
클래스의 determineValidationHints
메소드 호출
5-1. 어노테이션이 java.validation.Valid인지, Validated인지, Valid 로 시작하는지 확인 후 Object Array 리턴
6. DataBinder -> ValidatorAdapter -> SpringValidatorAdapter 를 통해 hibernate.validator의 ValidatorImpl 클래스 호출
6-1. ValidatorImpl 에서 검증 후 결과 리턴
7. 검증 결과 Errors 에 값이 있을 시 @Valid -> MethodArgumentNotValidException
, @Validated -> ConstraintViolationException
발생