@Valid vs @Validated
음 .. 우선 이름부터 비슷하고 하는 역할도 비슷할 것 같았다.
역할은 이름에서도 알 수 있듯이 검증의 역할을 하고 있으며 각 어노테이션은 차이가 있다.
@Valid는 주로 클라이언트에서 들어온 데이터를 검증할때 사용한다.
즉, RequestBody를 검증할때 많이 사용한다.
이때 함께 사용되는 어노테이션으로는 @NotNull, @NotEmpty, @NotBlank 등이 존재한다
클라이언트로부터 들어오는 데이터는 크게 3가지 종류가 존재한다.
방금 request body 의 경우에는 @Valid를 통해 검증하는것을 확인하였고
그렇다면 1, 2의 경우에는 어떻게 검증을 할까 ?
class
레벨에 Validated
를 선언하고 원하는 검사의 어노테이션을 붙여주면 됩니다.
...
@Validated
public class CarAPI {
...
@GetMapping("/{id}")
public ResponseEntity CreateCar(PathVariable @Min(1) Long id) {
return ...
}
...
@Valid를 통해 입력값 검증 과정에서 예외가 발생한다면 이는 MethodArgumentNotValidException
예외를 발생시키고 Exception Handler로 핸들링을 할 수 있습니다.
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseMessage<String> handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
return ResponseMessage.badRequest("");
}
@Validated를 사용했다면 ConstraintViolationException
예외가 발생하고 아래와 같이 처리할 수 있습니다.
@ExceptionHandler(ConstraintViolationException.class)
public ResponseMessage<String> handleMethodConstraintViolationException(ConstraintViolationException e) {
return ResponseMessage.badRequest("");
}