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 상태코드를 반환하게 된다.
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;
// 나중에 필드가 추가된다면? 현재 기준으로 작성되었던 테스트도 실패하게 된다.
}