Backend/SpringBoot

Custom Annotation (Custom validation)

Dean83 2025. 10. 29. 16:33

어노테이션을 커스텀으로 만들 수 있다. 예를들어, 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