backoffice 서버를 구현하던 도중 회원가입 기능에서 내가 전화번호 형식을 지정하고 싶다는 생각이 들었다.
내가 원하는 방식으로 유효성을 검사하는 방법을 알아본 결과 커스텀 밸리드애너테이션이 가능하다는 것을 알았다.
@Target(ElementType.FIELD) // 1
@Retention(RetentionPolicy.RUNTIME) // 2
@Constraint(validatedBy = TelValidator.class) // 3
public @interface Tel {
String message() default "휴대폰 번호 입력 형식이 틀렸습니다."; // 4
Class[] groups() default {};
Class[] payload() default {};
}
default : 제약조건 위반시 전달할 메세지
groups : 유효성 검사 그룹을 위한 속성
payload : 사용되지는 않지만 지정해서 사용 가능
public class TelValidator implements ConstraintValidator<Tel, String> { // 1
@Override
public boolean isValid(String value, ConstraintValidatorContext context) { // 2
if (value == null) {
return false;
}
return value.matches("(01[016789])-(\\d{3,4})-(\\d{4})");
}
}
@Getter
@Setter
public class SignupRequestDto {
@Email
@NotBlank
private String email;
@NotBlank
private String password;
@Tel
private String phoneNumber;
private char gender;
private String phone;
private String address;
private String role;
}
@PostMapping("/signup")
public ResponseEntity<String> signup(@RequestBody @Valid SignupRequestDto requestDto) {
memberService.signup(requestDto);
return ResponseEntity.status(HttpStatus.CREATED)
.body("회원가입 완료");
}
정상적으로 입력을 한다면 010-2222-2222이 맞는데 '-'하나가 빠졌기 때문에 정상적으로 입력이 되지 않았다.
default message [phoneNumber]]; default message [휴대폰 번호 입력 형식이 틀렸습니다.]] ]
정상적으로 회원가입이 완료된것을 볼 수 있다.