implementation("org.springframework.boot:spring-boot-starter-validation")
LocalValidatorFactoryBean이 제약 조건 검증을 처리하며 이용하기 위해서는 LocalValidatorFactoryBean을 빈으로 등록해야 하는데 의존성만 추가한다면 자동 구성으로 인해 빈으로 등록됨ArgumentResolver가 동작하는데 @Valid 역시 ArgumentResolver에 의해 처리됨@RequestBody 의 Json을 ArgumentResolver 구현체인 RequestResponseBodyMethodProcessor가 처리하며 내부에서는 @Valid로 시작하는 어노테이션 있는 경우 검사를 진행함(따라서 @Validxxx 형태의 어노테이션이여도 동작)@ModelAttribute를 사용하는 경우 ModelAttributeMethodProcessor에 의해 처리됨MethodArgumentNotValidException 예외가 발생하며 디스패처 서블릿에 기본으로 등록된 ExceptionResolver인 DefaultHandlerExceptionResolver에 의해 400 BadRequest 에러 발생@Validated 와 결합해서 사용해야함JSR-303 format 으로 빈 검증기를 이용해 객체의 제약 조건을 검증하도록 지시하는 어노테이션
이후 컨트롤러 메서드에 @Valid를 적용하면 유효성 검증이 진행됨
코드 예시
// DTO Class
public class AddUserRequest {
@Email
private final String email;
@NotBlank
private final String pw;
@NotNull
private final UserRole userRole;
@Min(12)
private final int age;
}
// Controller Class
@RestController
@RequestMapping("/api/v1/user")
public class UserController {
@PostMapping
public ResponseEntity addUser(@RequestBody @Valid AddUserRequest addUserRequest) {
// service 코드
}
}
@Validated 제공(JSR 표준이 아니며 Spring에서 제공)@Valid와 다른 점은 MethodArgumentNotValidException 예외가 아닌 ConstraintViolocationException 예외가 발생