본문 바로가기
Java & Spring Boot

자바에서 효율적으로 Exception 커스텀하기

by 향각산 2022. 2. 8.

원하는 기능을 찾다가 발견해서 올립니다. 다만 해당 글에 대한 정보들이 다 조금은 지난글이라 최근에도 이런식으로 사용하는지 모르겠네요. 혹시라도 최신 방법을 아시면 댓글 남겨주세요. :(

 

에러케이스 1.

어디서 발생하는지 알고, 무엇이 문제인지도 알지만 Exception으로 관리해야 하는 경우 ex) 토큰만료, 권한검증

(실제 토큰 처리를 하는 더 좋은 방법이 존재할 수 있음)

간단하게 설명하기 위한 예시코드, 실제론 npe로 안쓰겠지요

Authentication은 내가 생성한것도 아니고 라이브러리를 가져다 쓰거나 애초에 Exception으로 막는방법밖에 제공되지 않는다고 가정하겠다.

그렇다면 해당 메서드의 문제는 에러를 Exception으로 쳐낼수밖에 없는 부분에 있다.

나는 해당 에러의 원인도 알고 위치도 알지만 Exception으로 떨궈내는 순간 stack trace에 log를 봐야한다.

현재는 짧고 간단하지만 실제 운영환경에서는 엄청나게 길 수 있다. 

 

에러케이스 2.

1번과 비슷하다. 1번과 비슷한 인증 또는 권한 문제로 자주 에러가 발생하지만 이미 너무 많은 수정이 필요한 경우다.

디테일한건 생략한다.

회사에서는 모든 코드를 내가 처음부터 만들지 않는다.

위처럼 코드가 좀 이상해보이지만 이미 동작하게 짜놓은 코드들이 존재할 수 있다. 마음대로 수정하기엔 프론트 개발자의 공수도 들어가야하고 생각보다 많은 곳에서 사용중일 경우 사이드 이펙이 터질 수 있다. 

그렇다고 매번 같은 스택 트레이스 로그를 보기는 죽어도 싫다. 

 

해결방법

그냥 커스텀 Exception만으론 해결되지 않는다. 이런식으로 커스텀하게 만들어도 로그는 똑같이 발생한다.

이런 경우에는 내가 만든 Exception클래스에 fillInStackTrace()를 오버라이드 해주면 된다.

기본값은 super.fillInStackTrace()를 리턴하는데 this만 변경해주면 된다.  매우 간단하다.

결과는 다음과 같이 나타난다. 기존의 CustomMyException 자리에 NotTraceException으로 교체했다.

이름은 잘 알아서...

그냥 이게 전부다. 물론 좀더 많은 내용을 남길 수 있다. 알아서 이쁘게 사용해보자.

 

해당 에러케이스들은 static 변수로 미리 만들어놓고 알맞는 위치에서 호출해줘서 사용하면 관리도 편하고 효율적일 것 같다.

 

참고한 글들은 다음과 같다. 대기업 기술블로그와 stackoverflow는 없는거빼고 다있다...

https://meetup.toast.com/posts/47

 

Java Exception 생성 비용은 비싸다. : NHN Cloud Meetup

Java Exception 생성 비용은 비싸다.

meetup.toast.com

https://stackoverflow.com/questions/31250598/prevent-stack-trace-logging-for-custom-exception-in-spring-boot-application