본문 바로가기
Java

@Email 어노테이션을 컬렉션 프레임워크에 적용하기

by 서사주 2022. 10. 29.

@Email 어노테이션을 처리하는 EmailValidator 클래스는 AbstractEmailValidator 클래스를 상속받고 있습니다.

이 클래스는 ConstraintValidator 인터페이스를 구현하고 있습니다.

이제 Target이 무엇인지 확인해보자.

 

AbstractEmailValidator가 구현하고 있는 인터페이스의 타겟은

CharSequence 즉, 단일 대상에 한해서만 검증을 수행하고 있습니다.

 

따라서 이메일 검증을 수행해야할 대상이 다수일 경우,

이메일 폼 검증을 수행해야 하지만, @Email 어노테이션을 사용하지 못하는 문제가 발생합니다.

 

이럴 때에는 별도의 Validator 클래스를 생성하면 됩니다.

해당 Validator가 수행하는 역할은 Collection에 저장되어 있는 각 CharSequence에 대해

기존의 EmailValidator 클래스로 검증하는 것입니다.

@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Validated(EmailCollectionValidator.class)
@Documented
public @interface EmailCollection {

    String message() default "{javax.validation.constraints.Email.message}";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}
public class EmailCollectionValidator implements ConstraintValidator<EmailCollection, Collection<String>> {

    @Override
    public void initialize(EmailCollection constraintAnnotation) {
    }

    @Override
    public boolean isValid(Collection<String> value, ConstraintValidatorContext context) {

        if (value == null) {
            return false;
        }

        EmailValidator validator = new EmailValidator();
        for (String s : value) {
            if (!validator.isValid(s, context)) {
                return false;
            }
        }
        return true;
    }
}

 

실제 Validation Check를 수행해야 할 곳에는 다음과 같이 적용시키면 됩니다.

public class MailSenderRequest {

    @Getter
    @Setter
    public static class Send {

        @NotNull
        @EmailCollection
        private List<String> to;

        private SubscriptionType subscriptionType;
    }
}

'Java' 카테고리의 다른 글

JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가.  (0) 2024.07.07