어노테이션을 커스텀으로 만들 수 있다. 예를들어, Validation을 하려 하는데, 기본 설정값보다 복잡하여 커스텀한 항목을 만들어야 할때 사용한다.
- 커스텀 어노테이션 클래스 생성
- 커스텀 어노테이션의 제약조건을 validate 할 수 있는 클래스 생성
두개로 나뉘어 진다.
혹은, 커스텀 어노테이션의 제약조건을 validate 할 수 있는 클래스를 생성하지 않고, 여러 어노테이션을 묶어서 사용할 수도 있다.
예를들어 @NotNull 어노테이션과 @Size 을 묶어서, 한번에 커스텀 어노테이션을 통해 검증을 진행 할 수도 있다.
먼저, 커스텀 어노테이션 클래스의 경우.
import jakarta.validation.Constraint;
import jakarta.validation.Payload;
import java.lang.annotation.*;
@Constraint(validatedBy = NumericStringValidator.class) // 실제 검증 클래스 지정
@Target({ ElementType.FIELD, ElementType.PARAMETER })
@Retention(RetentionPolicy.RUNTIME)
public @interface NumericString {
String message() default "숫자 문자열만 허용됩니다";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
- Class<?>[] groups() default {}; 와 Class<? extends Payload>[] payload() default{}; 는 무조건 포함되는듯 하다.
- @Target 에서 어디에 붙일 어노테이션인지 설정한다. (예에서는 맴버변수인 필드에 붙임)
- @Retention 은 해당 어노테이션을 언제까지 적용할지 설정하는 것이다. Valid를 위해서는 런타임 시점까지 동작해야 ㅏㅎㄴ다.
- @Constraint 가 실제 검증할 클래스를 지정해 준다.
커스텀 어노테이션을 검증하는 Validator 클래스의 경우
- 패턴은 Regex 형식으로 구성한다.
- ConstraintValidator 를 implements 해야 한다.
import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;
public class NumericStringValidator implements ConstraintValidator<NumericString, String> {
private static final Pattern PATTERN = Pattern.compile("\\d+");
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if (value == null) return true; // @NotNull과 함께 사용 가능
return PATTERN.matcher(value).matches(); // 숫자 문자열만 허용
}
}'Backend > SpringBoot' 카테고리의 다른 글
| @JoinTable (0) | 2025.10.31 |
|---|---|
| BaseEntity 사용 및 time 정보 자동 생성 (0) | 2025.10.31 |
| Json 형식으로 로깅 하기 + MDC (0) | 2025.10.29 |
| EC2 에 배포한 서버에 Https 적용하기 (0) | 2025.09.22 |
| Swagger 사용하기 (0) | 2025.09.22 |