기본적으로 제공되는 어노테이션 말고, 직접 만들어볼 수 있다.
1. 제약(Constraint) @interface 작성
여기서 message, groups, payload는 기본적으로 꼭 작성해주어야 하는 값이다.
@Size(max = 10, message = "...", groups = {...}) 이런식으로 받아지는 값이라고 생각하면 쉬움
@Target({METHOD, FIELD, TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})
@Retention(RUNTIME)
@Constraint(validatedBy = SmsBytesSizeValidator.class)
@Documented
public @interface SmsBytesSize {
String message() default "";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
2. 검증자(Validator) 작성
ConstraintValidator를 상속받아 직접 검증하는 코드를 구현할 수 있다.
SmsBytesSize는 위에서 작성한 것.. String은 검증할 Field값이라고 생각하면 된다. 당연히 Object도 가능하다.
initialize는 현재의 경우 특별히 작성할 것이 없어 빈채로 나뒀지만(아예 지워버려도 됨) 만약 Constraint에서 어떠한 값을 받기로 했다면 initialize안에서 초기화해주어야 함!
isValid는 검증을 하는 부분,, value라는 값으로 검증할 값이 들어오고 그 값을 이용해 유효성 검사를 하면 된다.
나의 경우 현재 90바이트가 넘을 경우에 유효하지 않다고 판단하고 있다.
public class SmsBytesSizeValidator implements ConstraintValidator<SmsBytesSize, String> {
@Override
public void initialize(SmsBytesSize constraintAnnotation) {
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
int count = 0;
try {
count = value.getBytes("EUC-KR").length;
addConstraintViolation(
context, "90bytes 초과"
);
return count < 90 ? true : false;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return true;
}
private void addConstraintViolation(ConstraintValidatorContext context, String msg) {
context.disableDefaultConstraintViolation();
context.buildConstraintViolationWithTemplate(msg).addConstraintViolation();
}
}
3. 사용하기!
직접 만든 어노테이션을 붙여 검증처리 할 수 있다!
groups속성을 이용해 조건처리도 가능
@SmsBytesSize(groups = Sms.class)
private String text;
+) groups속성은 구분하기 위한 값으로, 빈 interface를 하나 생성하면 됨
public interface Sms {
}
+) 이런식으로 한데 모아 관리하는 것도 가능
public interface ColorGroups {
public interface Red {}
public interface Blue {}
/* ... */
}
///////////
@NotEmpty(groups = ColorGroups.Red.class)
private String required;
+) 참고
'STUDY > Spring' 카테고리의 다른 글
Spring Boot | REST API 파일 업로드 / 다운로드 (1) | 2021.03.23 |
---|---|
Spring Boot | @ControllerAdvice로 Exception 처리하기 (0) | 2021.03.19 |
Spring Boot | spring-boot-starter-validation (2) | 2021.03.16 |
Spring Boot | Spring Security 한 유저에게 여러 Authority(ROLE) 부여하기 (UserDetails) (0) | 2021.03.15 |
Spring Boot | Spring Security OAuth2 (7) 토큰과 함께 다른 정보 응답 (0) | 2021.03.12 |