
어노테이션을 생성하여 Custom Validator 처리를 할 수 있음
package com.example.validation.model;
import com.example.validation.annotation.PhoneNumber;
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import lombok.*;
import javax.validation.constraints.*;
import java.util.Objects;
@Getter @Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class)
public class UserRegisterRequest {
private String name;
private String nickName;
private Integer age;
@Email(message = "이메일 형식이어야 함")
private String email;
@NotBlank(message = "폰번호는 필수")
private String phoneNumber;
@AssertTrue(message = "name or nickname은 필수")
public boolean isNameCheck() {
if(name != null && !name.isBlank()) {
return true;
}
if(nickName != null && !(nickName.isBlank())) {
return true;
}
return false;
}
}
UserRegisterRequest Class
폰번호 입력 필드인 phoneNumber 에서 휴대폰 번호 형식 검증을 위해 별도 어노테이션을 생성한다.
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = { PhoneNumberValidator.class })
public @interface PhoneNumber {
String message() default "핸드폰 번호 양식에 맞지 않습니다. ex)000-000-0000";
String regexp() default "^01([0|1|6|7|8|9])-?([0-9]{3,4})-?([0-9]{4})$";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
PhoneNumber Interface
휴대폰 번호 검증 인터페이스를 생성하며 휴대폰 번호 양식이 맞지 않을 경우 띄우는 message() 메서드와 정규식 메서드인 regexp()를 작성하며 groups() 메서드와 payload() 메서드는 @NotNull 또는 @NotBlank 어노테이션에서 참고하여 가져온다.
또한 첨부된 어노테이션은 아래와 같다.
@Target: 사용자가 작성한 어노테이션이 부착될 수 있는 타입을 설정
@Retention: 사용자 어노테이션이 어느 시점까지 활성화 되어 있을지 설정
@Constraint: Constraint의 validatedBy 값으로 아래에서 정의할 validator를 전달해주면 Spring Boot는 우리가 API를 호출할 때 전달한 값을 가져오면서 validation을 수행
public class PhoneNumberValidator implements ConstraintValidator<PhoneNumber, String> {
private String regexp;
@Override
public void initialize(PhoneNumber constraintAnnotation) {
this.regexp = constraintAnnotation.regexp();
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
boolean result = Pattern.matches(regexp, value);
return result;
}
}
PhoneNumberValidator Class
폰 번호 검증 Validator 클래스를 생성하여 @Constraint 어노테이션에 넘겨주어야 한다.
ConstraintValidator 인터페이스를 implements 하며 해당 제네릭으로 검증할 PhoneNumbere 어노테이션, 검증으로 넘겨 받을 입력 값의 형식을 설정하여 준다.
아래 메서드를 오버라이드 하여 정규식을 통해 검증한다.