본문 바로가기

공부 기록/Spring

[Spring] Validation(2) - Custom Validation

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