티스토리 뷰

반응형
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


https://www.nextree.co.kr/p3239/

위 표로 깔끔하게 정리가 되는 것 같다.

 

처음에 소개한 "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
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함