Custom Validation의 두 가지 방법
1. AssertTrue / False 어노테이션을 통해 특정 메서드를 커스텀 검증 로직으로 적용
2. 커스텀 어노테이션 생성 및 ConstraintValidator를 적용하여 재사용 가능한 커스텀 검증 로직 적용
1) @AssertTrue 어노테이션을 이용한 검증
@Getter
public class member {
...
private String joinDate;
@AssertTrue // 값이 true일 때 검증 성공
public boolean isValidDate() {
if( ... ) { // joinDate의 값이 유효하지 않은 입력값일 때
return false;
}
return true;
}
}
클래스 내에 검증 로직을 적용한 메서드를 생성하고 @AssertTrue / False 어노테이션을 붙여준다.
이 방법은 특정 클래스 내에서 적용되므로 재사용이 안 된다.
2) 커스텀 어노테이션 및 ConstraintValidator를 이용한 검증
- 커스텀 어노테이션 @DateValid 생성
@Constraint(validatedBy = { })
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
public @interface DateValid {
String message() default "양식과 맞지 않습니다.";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
String pattern(); // 위와 같이 default 값 설정 가능
}
- 검증이 필요한 필드에 어노테이션 적용
@Getter
public class member {
...
@DateValid(pattern = "yyyyMMdd")
private String joinDate;
}
- ConstraintValidator를 구현한 클래스 DateValidator 생성
public class DateValidator implements ConstraintValidator<DateValid, String> {
private String pattern;
@Override
public void initialize(DateValid constraintAnnotation) {
this.pattern = constraintAnnotation.pattern();
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
... // 검증 로직
return true;
}
}
- @DateValid가 DateValidator 클래스를 이용할 수 있도록 지정
@Constraint(validatedBy = {DateValidator.class}) // 추가
...
public @interface DateValid {
...
}
이 방법은 여러 Dto의 필드에 재사용할 수 있다.
* 클래스의 필드가 검증이 필요한 객체일 때
@Getter
@Setter
class Person {
@NotBlank
private String name;
@JsonProperty("AGE")
private int age;
@Valid // Cat에 대한 검증을 위해 붙여줘야 함
private List<Cat> friends;
}
@Getter
@Setter
class Cat {
@NotBlank
private String name;
@NotBlank
@Min(value = 0)
private int age;
}
'공부 기록 > Spring' 카테고리의 다른 글
[Spring] Filter (0) | 2023.05.31 |
---|---|
[Spring] Exception Handling (0) | 2023.05.04 |
[Spring] Validation(1) - Annotation (0) | 2023.05.01 |
[Spring] AOP의 활용 (0) | 2023.04.27 |
[Spring] AOP (0) | 2023.03.28 |