개발 관련 기록과 정리/Spring Boot

스프링 부트(Spring boot) 유효성 검사(validation) 사용자(custom) 어노테이션(annotation) 생성

롱기누스 2019. 5. 28. 13:18

어노테이션으로 사용 할 클래스를 생성 한다.

NumberSymbol.java (interface)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package com.example.demo.common.validator.defaults;
 
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
 
import javax.validation.Constraint;
import javax.validation.Payload;
 
@Constraint(validatedBy = NumberSymbolValidator.class)
@Target({ ElementType.METHOD, ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface NumberSymbol {
 
    String message() default "{com.example.demo.common.validator.NumberValidator.message}";
 
    Class<?>[] groups() default {};
 
    Class<extends Payload>[] payload() default {};
 
}
 
cs

@Constraint은 제약 조건 설정으로 이 글은 유효성 검사에 중점을 두었기 때문에 validatedBy를 사용하여 어노테이션의 정의를 어디에 할 것인지 클래스를 지정한다.

@Target, @Retention는 어노테이션 사용 할 때 필수적으로 사용되는데 자세한 내용은 검색을 추천한다.

@Documented는 문서화하겠다는 의미인데 이것도 검색을 추천한다.

message 메소드의 기본 경로를 현재 클래스의 패키기 경로를 포함해서 입력한다.

 

 

초기 처리 로직과 유효성 검사 로직을 입력한다.

NumberSymbolValidator.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package com.example.demo.common.validator.defaults;
 
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
 
public class NumberSymbolValidator implements ConstraintValidator<NumberSymbol, String> {
 
    @Override
    public void initialize(NumberSymbol constraintAnnotation) {
        // 초기 설정 로직 설정
        ConstraintValidator.super.initialize(constraintAnnotation);
    }
 
    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        // 유효성 검사 로직 설정
        return false;
    }
 
}
 
cs

여기서 중요한 부분은 상속 받은 ConstraintValidator 이 부분이다.

키 부분을 앞에서 생성한 어노테이션 클래스를 입력하고 뒤에는 타입을 정의한다.

초기 설정 로직은 필수가 아니기 때문에 입력하지 않아도 문제는 되지 않는다.

유효성 검사 로직은 반드시 작성하고 결과를 얻을 수 있도록 한다.

return이 유효성 검사 결과 만족하면 true, 그렇지 못하면 false로 검사 처리를 끝낸다.

 

이렇게 생성한 어노테이션을 각 DTO의 매개변수에 정의한다.

SearchDto.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package com.example.demo.dto;
 
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
 
import com.example.demo.common.validator.defaults.NumberSymbol;
 
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
 
@ToString
@Getter
@Setter
public class SearchDto {
 
    @NumberSymbol(message = "{email.notempty1}")
    private String item1;
 
    @NotEmpty(message = "{email.notempty}")
    private String item2;
 
    @NotBlank(message = "{email.notempty}")
    private String item3;
 
    private String item4;
 
}
 
cs

기본 설정 및 사용법은 여기까지 추가적으로 기능은 다른 글에서 계속