개발공부/주저리

Kotlin 이더라도 CheckedException, UnCheckedException 정의를 주의할 것

siotMan 2021. 10. 17. 23:23

자바에서는 두가지 익셉션 부류를 나눌 수 있다.

 

1. CheckedException

2. UnCheckedException

 

CheckedException 은 예외처리를 보장받아야한다.

try catch, throws 등으로 처리해야하며, 처리하지 않을 경우 컴파일러가 에러를 잡아준다.

Exception, Throwable, 스프링의 BindException 이 대표적인 예이다.

 

UnCheckedException 은 예외처리가 보장되지 않는다.

IllegalArgumentException, NullPointerException, Error 등이 대표적인 예이다.

 

코틀린과 연관한 대부분의 라이브러리는 자바로 구현되어 있으므로, 코틀린과 혼합 사용 시 위의 점을 고려하지 않으면 의도하지 않은 결과를 볼 수 있다.

 

예를 들어 트랜젝션 매니저 등의 스프링 라이브러리는 처리가 정의되지 않은 CheckedException 에 대해 UndeclaredThrowableException 으로 감싸 UnCheckedException 으로 반환하므로, 트랜젝션에 들어가기 전 try catch 를 정의했다면 그 예외처리에서의 처리가 의도하지 않은 방향으로 흘러갈 수 있다.

 

사족으로, 롤백을 판단하는 타이밍 또한 달라지는 등, 그 처리가 일반적인 상황과 달라진다.

 

예를 한가지 더 들자면, ControllerAdvise 등의 aop 에서 해당 예외를 캐치하지 못한다. - boot 2.2.13 기준

 

사족으로, @Retry 의 경우 cause 를 트레이싱하므로, 의도한대로 동작했다고 착각할 수 있다.

 

또한 몇몇의 라이브러리가 이러한 자바의 특성을 전제하여 reflection 간에 throws 키워드로 정의한 CheckedException 들에 대해 처리하고 있다. (즉, declaredException 을 보고 무언가 처리하고 있을 수 있다.) 관련한 에러에 대해 이 점이 디버깅에 있어 사소한 힌트가 될 수 있다.