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
예외가 발생