티스토리 뷰
CompletableFuture<String> future = asyncRestTemplate.exchange(...)
.handleAsync((responseEntity, throwable) -> {
if (throwable instanceof HttpClientErrorException) {
throw new CustomException(((HttpClientErrorException) throwable).getStatusCode());
} else if (throwable instanceof RestClientException) {
throw new CustomException(500);
}
return responseEntity;
});
실제 프로젝트에서 위와같은 코드를 사용했는데 throw new 라인에서 다음과 같은 컴파일 에러가 발생한다.
"Unhandled exception: com.wemakeprice.rms.common.exception.RequestResourceException"
처음에는 CompletableFuture 내부에서는 Custom Exception 을 throw 를 못하는 줄 알았다. 하지만 작성되어 있던 Custom Exception 이 RuntimeException 을 상속받는 것이 아니라 Exception 을 상속받는다는 것을 뒤늦게 깨달았고, CompletableFuture 내부에서는 RuntimeException 만 throw 할 수 있다는 것을 알게되었다.
Exception 과 RuntimeException 의 차이를 정확하게 모르겠어서 해당 포스팅을 통해서 공부하려고 한다.
Java 에서의 예외는 크게 Error 와 Exception 로 나눠진다.
Error 는 시스템에 비정상적인 상황이 생겼을 때 발생하는 예외를 말한다. 이는 시스템 레벨에서 발생하기 때문에 심각한 오류이다. 이러한 Error 는 개발자가 미리 예측하여 처리할 수 없기 때문에 애플리케이션을 개발할 때 오류 처리에 대한 신경을 쓰지 않아도 된다. 이렇게 개발자가 예외처리를 하지 않아도 되는 예외를 Unchecked Exception 이라고 한다.
Exception 은 개발자가 구현한 로직에서 발생한다. 즉, 개발자가 Exception 을 미리 예측할 수 있으며 별도의 로직을 추가해 회복과 같은 처리를 해줘야 한다.
Exception 중에서도 RuntimeException 과 이를 상속받는 것들은 Unchecked Exception 이고, 이를 제외한 나머지 것들은 Checked Exception 이다. Checked Exception 이란 코드상에서 반드시 예외처리를 해야하는 Exception 을 의미한다. 제일 위에서 소개한 Unhandled Exception 에러는 Checked Exception 에 대한 예외처리를 하지 않았기 때문에 발생하는 것이다.
Checked Exception vs UnChecked Exception
위 표로 깔끔하게 정리가 되는 것 같다.
처음에 소개한 "Unhandled exception: com.wemakeprice.rms.common.exception.RequestResourceException" 예외는 Checked Exception 임에도 불구하고 예외처리를 하지 않았고, 컴파일 단계에서 발견된 것이다.
이를 해결하기 위한 방법으로는 예외를 처리해주거나 해당 Custom Exception 을 RuntimeException 클래스를 상속받도록 수정하는 것이 있다. 나는 후자를 선택했다!
예외처리방법
예외를 처리하는 방법에는 크게 세 가지 방법이 있다. 예외를 회복하는 방법과 예외를 회피하는 방법, 마지막으로 예외를 전환하는 방법이 그 것들이다.
예외를 회복하는 방법은 try - catch 구문이나 CompletableFuture 의 exceptionally, handle 과 같은 메소드에서 수행할 수 있으며 다른 작업 흐름으로 이어지도록 로직을 작성하면 된다. 예를들면 예외가 발생했을 때 준비해놓은 더미 데이터를 Fallback 하도록 하는 작업이 있을 것 같다.
예외를 회피하는 방법은 throws 를 통해서 직접 예외를 처리하지 않고 해당 메소드를 호출한 쪽으로 예외를 전달하는 것을 의미한다.
예외를 전환하는 방법은 예외가 발생했을 때 또 다른 예외로 throw 하는 것을 의미하는데, 주로 Custom Exception 을 사용하기 위해서 이러한 방법을 사용하는 것 같다. Custom Exception 을 사용하면 예외를 조금 더 명확한 의미를 가지도록 할 수 있고 Handler 를 통해 세부적으로 처리할 수 있다는 장점이 있다.
'Back-End > Java' 카테고리의 다른 글
[Java] 외부 프로세스 실행 (0) | 2021.03.30 |
---|