Assert를 커스텀custom해보자 커스텀한 애노테이션을 통해 파라미터 검증하기을 통해 파라미터 검증하는 방법을 알아보았다. 하지만 이는 @RequestBody이나 @ModelAttribute에나 적용이 가능하기 때문에 Request로 들어오는 파라미터만 아닌 일반 파라미터에 대한 것도 파라미터 검증이 필요할 때가 있다.
이 때 AOP를 사용해도 되지만 너무 어렵다는 단점이 있다. 간단하게 파라미터 검증을 할 수 있는 방법이 있다.
바로 Assert이다
1. 기본 Assert
Assert 스프링공식문서를 확인하거나 직접 코드를 import해서 확인해보면 기본의 Assert 사용법이 잘 나와있다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
publicabstractclassAssert{...publicstaticvoidisTrue(booleanexpression,Stringmessage){if(!expression){thrownewIllegalArgumentException(message);}}...}Integeri=0;Assert.isTrue(i>0,"The value must be greater than zero");//실제사용코드
위 코드에서 6번째 라인을 보면 IllegalArgumentException을 던지는 것을 확인할 수 있다.
하지만 IllegalArgumentException이 아니라 자기가 원하는 Exception을 던지고 싶을수 있다.
publicclassCustomAssertextendsAssert{...publicstaticvoidnotNull(@NullableObjectobject,Stringmessage,finalClass<?extendsRuntimeException>exceptionClass){if(object==null){throwthrowException(message,exceptionClass);}}...privatestaticRuntimeExceptionthrowException(Stringmessage,finalClass<?extendsRuntimeException>exceptionClass){try{returnexceptionClass.getDeclaredConstructor(String.class).newInstance(message);}catch(Exceptione){e.printStackTrace();thrownewAssertException("예외 처리 중 오류가 발생했습니다. "+e.getMessage());}}}publicclassValidateKeyExceptionextendsRuntimeException{publicValidateKeyException(){}publicValidateKeyException(Stringmessage){super(message);}publicValidateKeyException(Stringmessage,Throwablecause){super(message,cause);}publicValidateKeyException(Throwablecause){super(cause);}}
2.2 다음과 같이 사용
1
2
3
4
5
6
7
8
9
10
11
@TransactionalpublicbooleanverifyEmail(Stringkey){//Redis를 이용하여 Key값의 Value값을 통해 사용자 메일 정보를 가져온다RequestMailrequestMail=redisService.getMailData(key,RequestMail.class);// 유효한 Key가 아닐경우 email = nullCustomAssert.notNull(requestMail,"유효한 키가 아닙니다",ValidateKeyException.class);...}
여기서의 8번째줄의 ValidateKeyException는 직접 만든 Exception이며 이 Exception은 RuntimeException을 상속받아야 한다
publicclassCustomAssertextendsAssert{privatestaticfinalStringNUM_ALPHA_PATTERN="^[a-zA-Z0-9]{6,20}$";publicstaticvoidisLoginPattern(Stringobject,Stringmessage){isMatched(object,NUM_ALPHA_PATTERN,message,PatternException.class);}publicstaticvoidisMatched(Stringobject,Stringpattern,Stringmessage,Class<PatternException>patternExceptionClass){if(object==null||"".equalsIgnoreCase(object))return;if(!object.matches(pattern)){throwthrowException(message,patternExceptionClass);}}privatestaticRuntimeExceptionthrowException(Stringmessage,finalClass<?extendsRuntimeException>exceptionClass){try{returnexceptionClass.getDeclaredConstructor(String.class).newInstance(message);}catch(Exceptione){e.printStackTrace();thrownewAssertException("예외 처리 중 오류가 발생했습니다. "+e.getMessage());}}}publicclassPatternExceptionextendsAccountStatusException{publicPatternException(){super("패턴 오류");}publicPatternException(Stringmessage){super(message);}publicPatternException(Stringmessage,Throwablecause){super(message,cause);}}
댓글 쓰기