
IntelliJ에서 new java class를 선택하면 annotation을 만들 수 있다.

@Constraint(validatedBy = {PhoneNumberValidator.class}) // 어떤 클래스로 validate를 진행할것이냐
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME) // 실행중에만 annotation 동작
public @interface PhoneNumber {
String message() default "핸드폰 번호 양식에 맞지 않습니다. ex) 000-0000-0000";
String regexp() default "^\\d{2,3}-\\d{3,4}-\\d{4}$";
// 아래 두 부분은 없으면 에러가 발생한다. > 기존 어노테이션 참고
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
}
public class PhoneNumberValidator implements ConstraintValidator<PhoneNumber, String> {
private String regexp;
@Override
public void initialize(PhoneNumber constraintAnnotation) {
this.regexp = constraintAnnotation.regexp(); //annotation에서 작성해준 default 정규식이 들어온다.
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
// value = validate 해야하는 값 -> 핸드폰번호
boolean result = value.matches(regexp); //=Pattern.matches(regexp, value) 파라미터 순서 확인
return result;
}
}
@pattern을 사용하여 정의해주었던 이전과 달리 @phoneNumber를 사용하여 재사용성이 높아졌다.
// @Pattern(regexp = "^\\d{2,3}-\\d{3,4}-\\d{4}$",message = "번호 형식에 맞지 않음")
@PhoneNumber
private String phoneNumber;