Spring Boot Web의 여러가지 기능-(5)

개발세발·2024년 1월 23일

커스텀한 Validation 사용해보기

  • 복합적인 조건에 대한 처리를 위해서
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class)
public class UserRegisterRequest {
    //@NotNull //null이면 안됨.
    //@NotEmpty //null이면 안되고,Empty(공백)도 안됨.
    //@NotBlank //null도 안되고, 공백도 안되고, 공백이 포함돼도 안됨.
    private String name;

    private String nickName;

    @Size(min = 1, max = 12)
    @NotBlank
    private String password;

    @NotNull
    @Min(1)
    @Max(100)
    private Integer age;

    @Email
    private String email;

    @PhoneNumber
    private String phonenumber;

    @FutureOrPresent
    private LocalDateTime registerAt;

    @AssertTrue(message = "name or nickname 은 존재해야 합니다.")
    public boolean isNameCheck(){
        if(Objects.nonNull((name)) && !name.isBlank()){
            return true;
        }
        if(Objects.nonNull((nickName)) && !nickName.isBlank()){
            return true;
        }
        return false;
    }

}
    @AssertTrue(message = "name or nickname 은 존재해야 합니다.")
    public boolean isNameCheck(){
        if(Objects.nonNull((name)) && !name.isBlank()){
            return true;
        }
        if(Objects.nonNull((nickName)) && !nickName.isBlank()){
            return true;
        }
        return false;
    }
  • name이나 nickname이 둘 중 하나는 존재하도록 조건을 지정해준다.
  • @AssertTrue 해당 값이 true여야 한다.
@Constraint(validatedBy = {PhoneNumberValidator.class})
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
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 {};
}
  • Phonenumber라는 어노테이션을 직접 만들어 준다.
  • @Retention(RetentionPolicy.RUNTIME): 실행 시만 동작하도록 지정
  • @Target({ElementType.FIELD}): 변수에만 해당 어노테이션을 적용
  • @Constraint(validatedBy = {PhoneNumberValidator.class})
  • String regexp() default "^\d{2,3}-\d{3,4}-\d{4}$"; 으로 입력 받은 패턴대로 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 constraintValidatorContext) {

        boolean result = Pattern.matches(regexp, value);

        return result;
    }
}
  • @PhoneNumber에 대한 validation을 실행해주는 클래스.
  • @Override
    public void initialize(PhoneNumber constraintAnnotation) {
    this.regexp = constraintAnnotation.regexp();
    } 정규식을 불러 옴.
  • 이렇게 validator를 만든 후에 @Constraint(validatedBy = {PhoneNumberValidator.class})으로 어노테이션과 연결해준다.

0개의 댓글