적용방법
1. build.gradle에 dependencies 적용
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-validation'
...
}
2. DTO 클래스에 유효성 검사식을 작성
3. Controller의 핸들러메서드 파라미터 중, 적용할 파라미터 앞에 @Vaild
4. Controller의 핸들러메서드 파라미터에 @PathVariable적용시, 클래스레벨에 @Valiated
* @PathVariable는 일반적으로 식별자 등에 사용
기본 사용방법 및 문법
1. 기본 애너테이션
1) @NotBlank : null값이나 공백인지 검증
2) @Pattern(regexp = "") : ""안의 패턴에 부합하는지 검증
* (message="") : @Pattern, @NotBlank 등에서 사용. 출력할 메세지를 지정
3) @Email : 유효한 이메일인지 검증 (* 주의 : javax.validation.constraints.Email 써야함)
2. 기본 문법
1) "^...$" : 문자열은 ^로 시작해서 $로 끝나야함
2) * : 앞에 평가할 대상이 0개 또는 1개 이상인지 평가
3) \s : 공백 문자열을 의미
4) \S : 공백 문자열이 아닌 나머지 문자열을 의미
5) ? : 앞에 평가할 대상이 0개인지 1개 인지를 의미
6) + : 앞에 평가할 대상이 1개인지를 의미
정규표현식
1. 대표적인 정규표현식
// 공백과 null값을 허용하지 않는 문자열 (이름 등)
regexp= "^\\S+(\\s?\\S+)*$"
// 010-3~4자리 숫자-4자리 숫자로 구성된 문자열 (휴대폰 번호 등)
regexp = "^010-\\d{3,4}-\\d{4}$"
2. 그 외 정규 표현식
: https://www.w3schools.com/java/java_regex.asp
: https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/Regular_Expressions
: https://beanvalidation.org/2.0/spec/#builtinconstraints
커스텀 애너테이션 정의
1. 공백을 허용하지 않는 커스텀 애너테이션 생성
: @Constraint(validatedBy = { .class}) 를 통해 Custom Validator를 추가함
: 2번에서 NotSpaceValidator 클래스를 정의할 것임
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {NotSpaceValidator.class}) // <= Custom Validator를 추가한 부분
public @interface NotSpace {
String message() default "공백이 아니어야 합니다"; // <= 애너테이션 추가시 별도의 정의가 없으면, 유효성 검사 실패시 표시되는 디폴트 메세지
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
2. Custom Validator 구현 (여기선 NotSpaceValidator클래스)
: ConstraintValidator 인터페이스를 구현해야함
: NotSpace는 CustomValidator와 매핑된 Custom Annotation을 의미
: String은 Custom Annotation으로 검증할 대상 멤버 변수의 타입을 의미
import org.springframework.util.StringUtils;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class NotSpaceValidator implements ConstraintValidator<NotSpace, String> {
@Override
public void initialize(NotSpace constraintAnnotation) {
ConstraintValidator.super.initialize(constraintAnnotation);
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
return value == null || StringUtils.hasText(value);
}
}
3. 1번에서 @NotSpace라고 정의한 애너테이션(인터페이스)를 DTO클래스 내 멤버변수에 적용
@Getter
@Setter
public class MemberPatchDto {
private long memberId;
@NotSpace(message = "회원 이름은 공백이 아니어야 합니다") // (1)
private String name;
@Pattern(regexp = "^010-\\d{3,4}-\\d{4}$",
message = "휴대폰 번호는 010으로 시작하는 11자리 숫자와 '-'로 구성되어야 합니다")
private String phone;
...
}
'Java & Spring > 프로젝트 기본 설정' 카테고리의 다른 글
[SpringBoot] Service (진행중) (0) | 2022.10.17 |
---|---|
[SpringBoot] Mapper (0) | 2022.10.17 |
[SpringBoot] DTO (0) | 2022.10.10 |
[SpringBoot] Controller (0) | 2022.10.09 |
[Spring Boot] Slice 테스트 & 통합 테스트 (2) | 2022.09.18 |