모르지 않다는 것은 아는것과 다르다.

Spring

@Valid, @Validated

채마스 2022. 2. 26. 01:12

@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 지원을 받을 수 있다.





@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 여야 한다.





@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