@Valid @Validated 정리

리브리버·2024년 3월 8일
0

TIL

목록 보기
15/17

@Valid vs @Validated
음 .. 우선 이름부터 비슷하고 하는 역할도 비슷할 것 같았다.

역할은 이름에서도 알 수 있듯이 검증의 역할을 하고 있으며 각 어노테이션은 차이가 있다.

  1. @Valid는 자바 표준스펙이며 @Validated는 스프링에서 제공하는 어노테이션이다.
  2. @Validated는 controller 뿐 아니라 service 단에서도 사용이 가능하다

언제 사용할까

Valid

@Valid는 주로 클라이언트에서 들어온 데이터를 검증할때 사용한다.
즉, RequestBody를 검증할때 많이 사용한다.
이때 함께 사용되는 어노테이션으로는 @NotNull, @NotEmpty, @NotBlank 등이 존재한다

@NotNull, @NotEmpty, @NotBlank

@Validated

클라이언트로부터 들어오는 데이터는 크게 3가지 종류가 존재한다.

  1. query String
  2. query parameter
  3. request body

방금 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("");
}

0개의 댓글