Api를 통해 들어온 ReqDto를 검증하기 위한 어노테이션으로는 @Valid와 @Validation가 있다.
[요약 - @Valid와 @Validated 유효성 검증 차이]
@Validated의 기능으로 유효성 검증 그룹의 지정도 있지만 거의 사용되지 않으므로 유효성 검증 진행을 기준으로 차이를 살펴보도록 하자.
@Valid는 JSR-303 표준 스펙(자바 진영 스펙)으로써 빈 검증기(Bean Validator)를 이용해 객체의 제약 조건을 검증하도록 지시하는 어노테이션이다.
build.gradle의 dependencies에 아래의 implementation을 추가해주어야 적용 가능하다.
implementation 'org.springframework.boot:spring-boot-starter-validation'
@Valid를 이용하면 service단이 아닌 객체 안에서, 들어오는 값에 대해 검증할 수 있다
올바르지 못한 값들이 dto를 통해 들어오는 경우 MethodArgumentNotValidException
가 발생한다.
어노테이션 | type | validation | |
---|---|---|---|
@AssertTrue | Boolean, boolean | 값이 항상 True 여야 한다. | |
@DecimalMax | 실수 제외 숫자 클래스. | 지정된 최대 값보다 작거나 같아야 하는 숫자이다. | String : value (max 값을 지정한다.) |
@DecimalMin | 실수 제외 숫자 클래스. | 지정된 최소 값보다 크거나 같아야하는 숫자이다. | String : value (min 값을 지정한다.) |
@Digits | BigDecimalBigIntegerCharSequencebyte, short, int, long, 이에 대응하는 Wrapper 클래스 | 허용된 범위 내의 숫자이다. | int : integer (이 숫자에 허용되는 최대 정수 자릿수), int : fraction (이 숫자에 허용되는 최대 소수 자릿수) |
null도 valid로 간주된다. | 올바른 형식의 이메일 주소여야한다. | ||
@Future | 시간 클래스 | Now 보다 미래의 날짜, 시간 | |
@FutureOrPresent | 시간 클래스 | Now의 시간이거나 미래의 날짜, 시간 | |
@Max | 실수 제외 숫자 클래스. | 지정된 최대 값보다 작거나 같은 숫자이다. | long : value (max 값을 지정한다) |
@Min | 실수 제외 숫자 클래스. | 지정된 최소 값보다 크거나 같은 숫자이다. | long : value (min 값을 지정한다) |
@Negative | 숫자 클래스 | 음수인 값이다. | |
@NegativeOrZero | 숫자 클래스 | 0이거나 음수인 값이다 | |
@NotBlank | null 이 아닌 값이다. | 공백이 아닌 문자를 하나 이상 포함한다 | |
@NotEmpty | CharSequence,Collection, Map, Array | null이거나 empty(빈 문자열)가 아니어야 한다. | |
@NotNull | 어떤 타입이든 수용한다. | null 이 아닌 값이다. | |
@Null | 어떤 타입이든 수용한다. | null 값이다. | |
@Past | 시간 클래스 | Now보다 과거의 날짜, 시간 | |
@PastOrPresent | 시간클래스 | Now의 시간이거나 과거의 날짜, 시간 | |
@Pattern | 문자열 지정한 정규식과 대응되는 문자열이어야한다. | Java의 Pattern 패키지의 컨벤션을 따른다 | String : regexp (정규식 문자열을 지정한다) |
@Positive | 숫자 클래스 | 양수인 값이다 | |
@PositiveOrZero | 숫자 클래스 | 0이거나 양수인 값이다. | |
@Size | CharSequence,Collection, Map, Array | 이 크기가 지정된 경계(포함) 사이에 있어야한다. | int : max (element의 크기가 작거나 같다), int : min (element의 크기가 크거나 같다) |
@Validated는 AOP 기반으로 메소드의 요청을 가로채서 유효성 검증을 진행해주는 JSR 표준 기술이 아닌 Spring 프레임워크에서 제공하는 어노테이션 및 기능이다.
출처: https://mangkyu.tistory.com/174 [MangKyu's Diary:티스토리]
이전의 MethodArgumentNotValidException 예외가 아닌 ConstraintViolationException 예외가 발생한다.
동일한 클래스에 대해 제약조건이 요청에 따라 달라질 수 있다.
이때 Stpring은 이를 위해 제약조건이 적용될 검증 그룹을 지정할 수 있도록 제공한다.
아래와 같이 제약 조건이 적용될 그룹을 groups로 지정해줄 수 있다.
여러 개라면 {}를 이용해 지정이 가능하다.
@NotEmpty(groups = {UserValidationGroup.class, AdminValidationGroup.class} )
private String name;
@NotEmpty(groups = UserValidationGroup.class)
private String userId;
@NotEmpty(groups = AdminValidationGroup.class)
private String adminId;
그리고 컨트롤러에서도 다음과 같이 제약조건 검증을 적용할 클래스를 지정해주면 된다.
@PostMapping("/users")
public ResponseEntity<Void> addUser(
@RequestBody @Validated(UserValidationGroup.class) AddUserRequest addUserRequest) {
...
}
참고
@Valid 를 이용해 @RequestBody 객체 검증하기
[Spring] @Valid와 @Validated를 이용한 유효성 검증의 동작 원리 및 사용법 예시 - (1/2)