-
커스텀 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