java custom validation 추가

JAVA 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://wedul.site/562

 

Custom Validation 만들어서 추가하기

Spring에서 @NotBlank, @Email등 여러 템플릿에 맞게 Validation을 넣을 수 있다. 하지만 추가적으로 패스워드 규칙과 같이 별도 체크할 validator가 필요할 때 만들어서 사용해야 하는데 만들어서 지정해보

wedul.site

https://devonce.tistory.com/42

 

[Spring Boot] Custom Constraint / Validation 파헤치기

이번 글에서는 Spring Boot에서 validation이 동작하는 원리를 간단하게 살펴보고 직접 validator를 정의하는 방법을 정리해보겠습니다. 참고로, validation에 대한 설명을 따로 하지는 않기 때문에 validation

devonce.tistory.com

https://bamdule.tistory.com/107

 

[Spring Boot] ConstraintValidator Custom 하기

Spring에서 JSR 303 어노테이션을 이용해 데이터 유효성검사를 진행할 수 있습니다. 보통 @NotBlank, @Size, @NotNull ...등 이미 만들어진 검증 어노테이션을 이용할 수 있지만, 자신의 목적에 맞는 검증 어

bamdule.tistory.com

 

반응형
Posted by 질주하는구
,