@Valid, @Validated
개요
- 평소 validation 처리할때 자주 사용했던, @Valid, @Validated 에 대해서 자세히 알아보고자한다.
@Valid
- JSR-303 표준 스펙이다.
- javax.validation.Vaild
- 필드에 달린 제약조건 어노테이션을 참고해 검증할때 주로 사용된다.
- 빈 검증기(Bean Validator)를 이용해서 검증하는 애노테이션이다.
- Spring에서는 LocalValidatorFactoryBean을 이용해 JSR 표준의 검증 기능을 사용할 수 있다. -> LocalValidatorFactoryBean 는 JSR-303의 검증 기능을 이용할 수 있도록 해주는 일종의 어댑터에 해당한다.
- @Valid 를 사용하려면, LocalValidatorFactoryBean을 빈으로 등록하고 VaidationService를 제공해주어야 하는데, SpringBoot에서는 의존성만 추가하면 검증을 위한 빈들이 자동으로 등록된다.
- 예외 발생시 MethodArgumentNotValidException 가 발생한다.
- ResponseEntityExceptionHandler 지원을 받을 수 있다.
- ResponseEntityExceptionHandler 지원을 받을 수 있다.
@Valid 와 함께 쓰는 필드 검증 애노테이션 종류
- @NotBlank
- null, "", " " 이 아닌 값을 말한다.
- 공백이 아닌 문자를 하나 이상 포함해야 오류가 발생하지 않는다.
- @NotEmpty
- null, "" 이 아닌 값이어야 한다.
- " " 은 허용됩니다.
- @NotNull
- null 이 아닌 값이어야 한다.
- "", " " 와 같은 값들은 허용된다.
- @Size(max = 10, min = 1)
- 1 보단 크거나 같고 10 보단 작거나 같아야 한다.
- @DecimalMax(value = "10000000")
- 10000000 보다 작거나 같아야 한다.
- @DecimalMax(value = "1")
- 1 보다 크거나 같아야 한다.
- @Max(value = 1000)
- 1000 보다 작거나 같아야 한다.
- @Max(value = 1)
- 1 보다 크거나 같아야한다.
- @Positive
- 양수인 값이어야 한다.
- @PositiveOrZero
- 0이거나 양수인 값이어야 한다.
- @Negative
- 음수인 값이어야 한다.
- @NegativeOrZero
- 0이거나 음수인 값이어야 한다.
- @Digits(integer = 5, fraction = 5)
- integer : 최대 정수 자릿수를 말한다.
- fraction : 최대 소수 자릿수를 말한다.
- @Future
- 현재(Now) 보다 미래의 날짜, 시간이어야 한다.
- @FutureOrPresent
- 현재(Now) 거나 미래의 날짜, 시간이어야 한다.
- @Past
- 현재(Now) 보다 과거 의의 날짜, 시간이어야 한다.
- @PastOrPresent
- 현재(Now) 거나 과거의 날짜, 시간이어야 한다.
- @Email
- 이메일 형식이어야 한다.
- @를 포함해야한다.
- @AssertTrue
- 값이 항상 True 여야 한다.
- @AssertFalse
- 값이 항상 False 여야 한다.
- 값이 항상 False 여야 한다.
@Validated
- @Valid 와 기능은 비슷하지만, validation 을 그룹을 지어 지정할 수 있다.
- org.springframework.validation.annotation,Validated
- 아래와 같이 메소드의 파라미터에 직접 검증을 할 수 있다.
@Service
@Validated
public class UserService{
public User add(@NotNull Long userId){
//... 생략
}
}
- 위에 코드에서 보듯 클래스 위에 @Validated 를 걸어주면, 메소드의 파라미터에 validation 처리를 할 수 있다.
- 아래와 같이 속성 제약조건에 대한 그룹을 만들어서 적용시킬 수 있다.
public class ValidationGroups {
public interface group1 {};
public interface group2 {};
}
- 위와 같이 group1, group2라는 이름의 마커 인터페이스를 선언한다.
public class User {
@NotEmpty(groups = {ValidationGroups.group1.class})
private Long userId;
@NotEmpty(groups = {ValidationGroups.group1.class})
private String account;
@NotEmpty(groups = {ValidationGroups.group2.class})
private String password;
}
- User의 속성 제약조건 어노테이션에는 groups 속성에 각 인터페이스에 대한 클래스 정보를 로드한다.
@RequestMapping(value = "/user/login", method = RequestMethod.POST)
public ResponseEntity login(@RequestBody @Validated(ValidationGroups.group1.class) Long userId) {
// ... 생략
}
- group1에 대해 효력이 발생하기 때문에 userId 와 account에 대한 유효성 검사만 진행될 것이다.
- 만약 password만 유효성 검사를 하고싶으면 group2로 바꾸어주면 된다.
- 제약 조건이 위반되면 ConstraintViolationException 이 발생한다.
REFERENCES
'Spring' 카테고리의 다른 글
BindingResult (0) | 2022.02.26 |
---|---|
Bean Validation (BindingResult 개념을 먼저 숙지 해야된다.) (0) | 2022.02.26 |
ApplicationRunner,CommandLineRunner (0) | 2022.02.26 |
API 예외처리 (0) | 2022.02.26 |
Spring AOP (0) | 2022.02.26 |