ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 커스텀 validation 만들기
    ☕️ java 2023. 1. 28. 17:46

    스프링 프레임워크가 기본적으로 제공하는 Validator Annotation으로 충분하지 않을 수 있다.

    필요에 따라 직접 Validator를 구현해야 하는 경우가 생길 수 있다.

    ❗Annotation


    Custom Constraint Annotation을 만들 때에는

    • message
    • groups
    • payload

    위 3개는 꼭 정의를 해주어야 한다.

    @Constraint(validatedBy = PasswordValidator.class)
    @Target({METHOD, FIELD, ANNOTATION_TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface PasswordValidation {
    
      String message() default "Password is not validate";
    
      // 사용자들이 targeted group을 커스텀하기 위해 사용
      Class<?>[] groups() default {}; 
    
      Class<? extends Payload>[] payload() default {};
    
    }

     

    📚 @Constraint

    • 애노테이션을 Bean Validation Constraint로 만들어주는 애노테이션이다.
    • 사용자가 원하는 Constraint와 Validation을 만들어 적용할 수 있다.
    • message, groups, payload 속성값을 반드시 가져야 한다.


    📖 message

    • 메시지 관리를 위해 사용


    📖 groups

    • 상황별 validation 제어를 위해 사용
    • ex) insert 하는 경우, update 하는 경우 validation를 구분 짓고자 할 때


    📖 payload

    • 사용자가 추가 정보를 위해 전달할 수 있는 값
    • 주로 심각도를 나타낸다.

     

    ❗Constraint Validator 구현 클래스


    public class PasswordValidator implements ConstraintValidator<PasswordValidation, String> {
    
      private static final int MIN_SIZE = 8;
      private static final int MAX_SIZE = 20;
      private static final String REGEX_PASSWORD =
          "^(?=.*[A-Za-z])(?=.*[0-9])(?=.*[$@$!%*#?&])[A-Za-z[0-9]$@$!%*#?&]{" + MIN_SIZE
          + "," + MAX_SIZE + "}$";
    
      @Override
      public void initialize(PasswordValidation constraintAnnotation) {
      }
    
      @Override
      public boolean isValid(String value, ConstraintValidatorContext context) {
    
        boolean isValidPassword = value.matches(REGEX_PASSWORD);
    
        if(!isValidPassword) {
          context.disableDefaultConstraintViolation();
          context.buildConstraintViolationWithTemplate(
              MessageFormat.format(
                  "{0}자 이상의 {1}자 이하의 숫자, 영문자, 특수문자를 포함한 비밀번호를 입력해주세요"
                  , MIN_SIZE
                  , MAX_SIZE))
              .addConstraintViolation();
        }
        return isValidPassword;
      }
    }

     

    📖 initialize()

    • annotation에 있는 정보를 멤버변수로 저장해 isValid() 에서 사용할 수 있다.


    📖 isValid()

    • 정의하고자하는 validation logic이 정의된다.

     

    📌 사용


     

    @PasswordValidation
    private String password;
    

     

    참고자료

    https://meetup.nhncloud.com/posts/223

    https://kapentaz.github.io/java/Java-Bean-Validation-제대로-알고-쓰자/#

    https://velog.io/@livenow/Java-커스텀-애노테이션으로-Password규칙-적용하기

    https://reflectoring.io/bean-validation-with-spring-boot/

    https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/

    '☕️ java' 카테고리의 다른 글

    [Java] Static 과 Final  (0) 2023.03.03
    Reflection API ?  (0) 2023.02.09
    equals / hashCode  (0) 2022.12.07
    CheckedException 과 UncheckedException  (0) 2022.10.10
    가비지 컬렉션(GC) ❓  (0) 2022.10.10

    댓글

Designed by Tistory.