JAVA
java custom validation 추가
질주하는구
2022. 2. 14. 15:11
작업 중 javax.validation 기본 규칙 이외에 추가로 규칙을 정의 해야 하는 경우 아래와 같은 방식으로 정의 할 수 있습니다.
(전자정부 apache-common-validation은 xml에 소스 작업을 하면 view 부분까지 모두 정의가 가능 한데... 하다가 마음에 안들면 전자정부 형식으로 변경 하려고 합니다.)
우선 사용할 validation 어노테이션을 정의 해줍니다.
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;
import egovframework.validation.PasswordValidator;
@Documented
@Target({ FIELD, METHOD })
@Constraint(validatedBy = PasswordValidator.class) //검증에 사용할 class정보를 정의 해당 클래스의 isValid 메소드를 통해서 데이터 검증 진행
//@Retention은 해당 어노테이션의 생명주기를 정의 합니다.
/*
RetentionPolicy.SOURCE : 소스 코드(.java)까지 남아있는다
RetentionPolicy.CLASS : 클래스 파일(.class)까지 남아있는다.(=바이트 코드)
RetentionPolicy.RUNTIME : 런타임까지 남아있는다.(=사실상 안 사라진다.)
SOURCE => lombok의 @getter, @setter 어노테이션의 경우 해당 설정으로 되어 있어 소스 작업시에는 보이지만 해당 소스가 class파일이 되면 해당 어노테이션은 삭제 되고
get, set 메소드가 class파일에 생성 되게 됩니다.
CLASS => @notnull의 경우 해당 합니디 .jar작업 시에도 해당 어노테이션이 살아 있어야 한다면 class로 설정 해줍니다. log4j등에서 @notnull
을 사용하게 되는데 이 경우 해당 정보는 java->class로 변경시 null체크만 추가 되는게 아닌 배포시에도 유의미 해야 하기 때문에 해당 설정으로 처리 합니다.
(배포형 소스가 아니라면 사용할 일이 거의 없습니다.)
RUNTIME => @Controller, @Service, @Autowired 같이 서비스가 실행 중일때도 확인이 가능한 어노테이션의 경우(해당 예시의 어노테이션은 서버 실행시 spring객체에 어노테이션 정보를 기준으로
데이터를 수집하고 직렬화 하기 때문에 runtime으로 되어 있습니다)
* */
@Retention(RetentionPolicy.RUNTIME)
public @interface PasswordCheck {
//기본 내용 시작
String message() default "비밀번호 양식을 확인 해주세요"; //validation이 실패할 경우 반환되는 default 메세지
Class<?>[] groups() default {}; //특정 validation을 group을 지정하는 값( Validation Grouping )
Class<? extends Payload>[] payload() default {}; //사용자가 추가 정보를 위해 전달할 수 있는 값으로 주로 심각도를 나타낼 때 사용됩니다.
//기본 내용 끝
//상단의 기본 내용은 어노테이션 작성시 반드시 들어가야 하는 내용으로 ConstraintHelper가 확인 하게 되어있습니다.
}
그리고 검증에 사용할 구현 소스를 정의 해줍니다.
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import org.apache.commons.lang.StringUtils;
import egovframework.validation.annotation.PasswordCheck;
public class PasswordValidator implements ConstraintValidator<PasswordCheck, String> {
@Override
public void initialize(PasswordCheck constraintAnnotation) {
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
//체크로직 구현
return false;
}
}
위에 정의한 어노테이션을 원하는 곳에 추가 해주면 됩니다.
https://devonce.tistory.com/42
https://bamdule.tistory.com/107
반응형