작업 중 javax.validation 기본 규칙 이외에 추가로 규칙을 정의 해야 하는 경우 아래와 같은 방식으로 정의 할 수 있습니다.
(전자정부 apache-common-validation은 xml에 소스 작업을 하면 view 부분까지 모두 정의가 가능 한데... 하다가 마음에 안들면 전자정부 형식으로 변경 하려고 합니다.)
우선 사용할 validation 어노테이션을 정의 해줍니다.
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 30 31 32 33 34 35 36 37 38 39 40 41 | <code class = "hljs java" > <span class = "hljs-keyword" > import </span> <span class = "hljs-keyword" > static </span> java.lang.annotation.ElementType.FIELD; <span class = "hljs-keyword" > import </span> <span class = "hljs-keyword" > static </span> java.lang.annotation.ElementType.METHOD; <span class = "hljs-keyword" > import </span> java.lang.annotation.Documented; <span class = "hljs-keyword" > import </span> java.lang.annotation.Retention; <span class = "hljs-keyword" > import </span> java.lang.annotation.RetentionPolicy; <span class = "hljs-keyword" > import </span> java.lang.annotation.Target; <span class = "hljs-keyword" > import </span> javax.validation.Constraint; <span class = "hljs-keyword" > import </span> javax.validation.Payload; <span class = "hljs-keyword" > import </span> egovframework.validation.PasswordValidator; <span class = "hljs-meta" > @Documented </span> <span class = "hljs-meta" > @Target ({ FIELD, METHOD })</span> <span class = "hljs-meta" > @Constraint (validatedBy = PasswordValidator. class )</span> <span class = "hljs-comment" > //검증에 사용할 class정보를 정의 해당 클래스의 isValid 메소드를 통해서 데이터 검증 진행</span> <span class = "hljs-comment" > //@Retention은 해당 어노테이션의 생명주기를 정의 합니다.</span> <span class = "hljs-comment" > /* 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으로 되어 있습니다) * */ </span> <span class = "hljs-meta" > @Retention (RetentionPolicy.RUNTIME)</span> <span class = "hljs-keyword" > public </span> <span class = "hljs-meta" > @interface </span> PasswordCheck { <span class = "hljs-comment" > //기본 내용 시작</span> <span class = "hljs-function" >String <span class = "hljs-title" >message</span><span class = "hljs-params" >()</span> <span class = "hljs-keyword" > default </span> "비밀번호 양식을 확인 해주세요" </span>; <span class = "hljs-comment" > //validation이 실패할 경우 반환되는 default 메세지</span> Class<?>[] groups() <span class = "hljs-keyword" > default </span> {}; <span class = "hljs-comment" > //특정 validation을 group을 지정하는 값( Validation Grouping )</span> Class<? extends Payload>[] payload() <span class = "hljs-keyword" > default </span> {}; <span class = "hljs-comment" > //사용자가 추가 정보를 위해 전달할 수 있는 값으로 주로 심각도를 나타낼 때 사용됩니다.</span> <span class = "hljs-comment" > //기본 내용 끝</span> <span class = "hljs-comment" > //상단의 기본 내용은 어노테이션 작성시 반드시 들어가야 하는 내용으로 ConstraintHelper가 확인 하게 되어있습니다.</span> } </code> |
그리고 검증에 사용할 구현 소스를 정의 해줍니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <code class = "hljs typescript" ><span class = "hljs-keyword" > import </span> javax.validation.ConstraintValidator; <span class = "hljs-keyword" > import </span> javax.validation.ConstraintValidatorContext; <span class = "hljs-keyword" > import </span> org.apache.commons.lang.StringUtils; <span class = "hljs-keyword" > import </span> egovframework.validation.annotation.PasswordCheck; <span class = "hljs-keyword" > public </span> <span class = "hljs-class" ><span class = "hljs-keyword" > class </span> <span class = "hljs-title" >PasswordValidator</span> <span class = "hljs-title" > implements </span> <span class = "hljs-title" >ConstraintValidator</span><<span class = "hljs-title" >PasswordCheck</span>, <span class = "hljs-title" >String</span>> </span>{ <span class = "hljs-meta" > @Override </span> <span class = "hljs-keyword" > public </span> <span class = "hljs-built_in" > void </span> <span class = "hljs-function" ><span class = "hljs-title" >initialize</span>(<span class = "hljs-params" >PasswordCheck constraintAnnotation</span>)</span> { } <span class = "hljs-meta" > @Override </span> <span class = "hljs-keyword" > public </span> <span class = "hljs-built_in" > boolean </span> <span class = "hljs-function" ><span class = "hljs-title" >isValid</span>(<span class = "hljs-params" ><span class = "hljs-built_in" >String</span> value, ConstraintValidatorContext context</span>)</span> { <span class = "hljs-comment" > //체크로직 구현</span> <span class = "hljs-keyword" > return </span> <span class = "hljs-literal" > false </span>; } } </code> |
위에 정의한 어노테이션을 원하는 곳에 추가 해주면 됩니다.
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
'JAVA' 카테고리의 다른 글
jaxb xml Unmarshaller (0) | 2022.02.28 |
---|---|
java.lang.ClassNotFoundException: com.sun.xml.bind.v2.ContextFactory (0) | 2022.02.28 |
@Retention 간략 설명 (0) | 2022.02.14 |
java 정규식 개인정보 마스킹 (0) | 2022.02.09 |
엑셀 날짜(date) 형식 컬럼 처리 (0) | 2021.11.29 |