커스텀한 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})으로 어노테이션과 연결해준다.