TodoList - RestControllerAdvice + ExceptionHandler를 이용한 예외처리
자바에서 모든 예외 클래스는 Throwable 클래스를 상속받고, Exception 클래스는 Checked Exception과 Unchecked Exception으로 나뉨
Checked Exception : 반드시 예외 처리가 필요한 예외로, 컴파일 단계에서 확인이 가능한 예외, (IOException, SQLException...)
Unchecked Exception : 예외처리가 강제되지는 않는 예외로, 런타임 단계에서 확인이 가능한 예외 (RuntimeException, NullPointerException, IllegalArgumentException...)
-> 간단하게 보자면 RuntimeException을 상속받는 Exception class = Unchecked Exception, 아니면 Checked Exception 이다.
Effective Java 에서 Exception에 관해 말하길, 사용자가 직접 구현하는 unchecked throwable은 모두 RuntimeException의 하위클래스여야 한다.
왜 CheckedException은 안될까?
로그인한 유저에 대해 동일한 제목에 해당하는 Todo를 반환해주는 메소드이다.
만약 userId 로 존재하지 않는 Id 값이 들어올 경우 orElseThrow 구문을 이용해 RuntimeException을 상속받는 CustomException을 호출했다.
이 코드를 살짝 수정해보자
CustomException 을 던지던 부분을 Exception 을 던지도록 수정하니 컴파일 에러가 발생했다.
Exception의 경우 Checked Exception 이므로 메소드 내에서 try catch문을 이용해 예외를 처리(예외복구) 하거나 상위 메소드로 throw (예외 회피) 해야한다.
만약 throw 로 예외를 회피 할 경우 상위 메소드에서 그 exception을 catch 하기 전 모든 중간단계 메소드에서 exception을 throw 해야한다.
이는 상위 메소드에서 하위 메소드의 디테일에 대해 알아야하는 것이기 때문에 OCP(개방 폐쇄 원칙) 에 위배된다.
try catch 문으로 잡는다고 해도 메소드 길이가 길어져 코드 가독성이 떨어지는 단점이 있다.
위와같은 단점들을 수용하면서 Checked Exception 을 사용할 이유가 없기 때문에 Unchecked Exception 을 사용하는것이 좋다.
CustomException
Unchecked Exception인 RuntimeException 을 상속받으며 ErrorCode 를 필드로 가지는 CustomException을 생성한다.
CustomExceptionHandler 에러처리 흐름
1. findTodoByTitle 메서드에서 에러 발생
2. RestControllerAdvice에서 TodoController로 넘어온 에러처리
3. ExceptionHandlerExceptionResolver 가 RestControllerAdvice에서 ExceptionHandler 어노테이션이 붙은 메서드를 찾은 뒤 메서드 실행
4. 정상흐름으로 was 까지 반환
참고
INU appcenter 7th study - juser0
클린코드 chap 7. 우아하게 예외 처리하기 (velog.io)