특정 익셉션 슬랙 알림 씹는 어노테이션

생성일
Nov 19, 2024 08:37 AM
상위 항목
최종 편집 일시
Last updated November 19, 2024
태그
JAVA
하위 항목
  1. 슬랙 알림을 씹게 할 익셉션 클래스에 붙일 어노테이션을 만든다.
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface NoSlackNotification { }
  1. 슬랙 알림을 보내지 않을 특정 익셉션에 어노테이션을 붙인다.
@NoSlackNotification public class ResourceException extends PayNStoreException { public ResourceException(BasicCodeMessage cm, String field) { super(cm, field); } public ResourceException(BasicCodeMessage cm) { super(cm); } }
  1. 슬랙 LoggerAop에 필터링 로직 추가
... try { result = pjp.proceed(); } catch (Exception e) { if (!isHealthCheck && !isTableOrder) { // 예외가 필터링 대상 어노테이션을 가지고 있는지 확인 if (!isExcludedException(e)) { LogUtil.requestLogging(log, request, jwtTokenProvider, requestTime, e); String logResult = LogUtil.stacktraceToString(e); slackWebHookService.create("api", logResult); } } LogUtil.removeMDC(); throw e; } ... private boolean isExcludedException(Exception e) { return e.getClass().isAnnotationPresent(NoSlackNotification.class) }
 
근데 이렇게 하면 저 익셉션이 전부 다 무시가 되어 버린다.
익셉션은 어떻게 보면 카테고리고 그 카테고리 안에 BasicCodeMessage가 세부 내용 같은 상황이다.
카테고리 전체를 무시하면 안되고 세부 내용에 대해서만 무시를 하는 방향으로 변경해야 한다.
 
어노테이션을 수정해서 BasicCodeMessage[]를 어노테이션이 가지게 하는 식으로 수정해보자.
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface NoSlackNotification { BasicCodeMessage[] excludeMessages() default {}; }
 
거르고자 하는 익셉션 쪽에 어노테이션에 value 목록을 포함해서 붙여준다.
@NoSlackNotification(excludeMessages = {CodeMessage.USER_NOT_FOUND, CodeMessage.TOKEN_NOT_VALID}) public class ResourceException extends Exception { public ResourceException(BasicCodeMessage cm, String field) { super(cm, field); } public ResourceException(BasicCodeMessage cm) { super(cm); } }