개발 관련 기록과 정리/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 |
기본 설정 및 사용법은 여기까지 추가적으로 기능은 다른 글에서 계속