자바 @Valid 사용해보기1. Valid를 사용하는 방법1-1 @Valid 적용시키기2. 검증 애노테이션 종류2-1 문자열 검증2-2 최대 / 최소 검증2-3 범위 검증2-4 시간 값 검증2-5 Bolean 검증2-6 크기 검증3. 자바 Valid 제공하지 않는것은 무엇일까?
자바 @Valid 사용해보기
1. Valid를 사용하는 방법
- @Valid 애노테이션을 이용하면, 객체 안에서 들어오는 값에 대해 검증이 가능해진다.
1-1 @Valid 적용시키기
public class ProductRequest { @NotNull // 인자로 들어온 필드 값에 null 값을 허용하지 않음 private String productName; @Email // 이메일 형식에 맞춘 값이 들어와야함 private String email; } @RestController public class ProductController { @PostMapping("/api/v1/product") public Product save(@Valid @RequestBody ProductRequest productRequest) { ~~~ } }
- 값이 올바르게 들어오지 않았다면 MethodArgumentNotValidException 예외와 400 Bad Request 상태코드를 반환하게 된다.
2. 검증 애노테이션 종류
2-1 문자열 검증
- @NotBlack
- null이 아닌 값
- 공백이 아닌 문자를 하나 이상 포함해야한다.
- 반드시 값이 존재하고 공백 문자를 제외한 길이가 0보다 커야한다.
- @NotEmpty
- null 이거나 empty(빈 문자열)가 아니어야 한다.
- 반드시 값이 있어야하며 길이가 0보다 커야아한다.
- @NotNull
- null이 아닌 값은 어떤 타입이든 상관없다.
- 반드시 값이 있어야함
- @Null
- 타입은 상관없으며 null값 허용

2-2 최대 / 최소 검증
public class MaxOrMin { @DecimalMax(value = "10000000") private BigInteger decimalMax; @DecimalMin(value = "1") private BigInteger decimalMin; @Max(value = 1000000) private Integer max; @Min(value = 1) private Integer min; }
- @DecimalMax
- 지정된 최댓값보다 작거나 같아야함.
- @DecimalMin
- 지정된 최솟값보다 크거나 같아야함.
- @Max
- 지정된 최댓값보다 작거나 같아야함.
- @Min
- 지정된 최솟값보다 크거나 같아야함.
Decimal과 기본 Max/Min의 차이는 범위 값의 차이다. String을 사용하는지 Integer를 사용하는지에 따라 범위가 달라지기 때문이다.
2-3 범위 검증
public class Range { @Positive private Integer positive; @PositiveOrZero private Integer positiveOrZero; @Negative private Integer negative; @NegativeOrZero private Integer negativeOrZero; }
- @Positive
- 양수인 값
- @PositiveOrZero
- 0이거나 양수인 값
- @Negative
- 음수인 값
- @NegativeOrZero
- 0이거나 음수인 값
2-4 시간 값 검증
public class Time { @Future private Date future; @FutureOrPresent private Date futureOrPresent; @Past private Date past; @PastOrPresent private Date pastOrPresent; }
- @Future
- Now 보다 미래의 날짜, 시간이어야 한다.
- @FutureOrPresent
- Now 거나 미래의 날짜, 시간이어야 한다.
- @Past
- Now 보다 과거의 날짜, 시간이어야 한다.
- @PastOrPresent
- Now 거나 과거의 날짜, 시간이어야 한다.
2-5 Bolean 검증
public class Bool { @AssertTrue private boolean assertTrue; @AssertFalse private boolean assertFalse; }
- @AssertTrue
- 항상 True 여야 한다.
- @AssertFalse
- 항상 False 여야 한다.
2-6 크기 검증
public class Size { @Size(max=25, min=7) private String sizeString; }
- @Size
- max > 값의 크기가 max보다 작거나 같아야 한다.
- min > 값의 크기가 min보다 크거나 같아야 한다.
이 외에도 추가적인 것들이 더 있다. https://docs.jboss.org/hibernate/beanvalidation/spec/2.0/api/
3. 자바 Valid 제공하지 않는것은 무엇일까?
- Valid는 @Validated와 다르게 그룹 유효성 검사를 지원하지 않는다는 차이점이 있다.
- 이러한 경우에는 @Validated 애노테이션을 이용해야 한다.
public class Account { @NotNull // @NotNull(groups = BasicInfo.class) @Validated 사용 private String password; @Email // @Email(groups = BasicInfo.class) @Validated 사용 private String email; // 나중에 필드가 추가된다면? 현재 기준으로 작성되었던 테스트도 실패하게 된다. }