4. 예외
예외 처리의 1원칙. 모든 예외는 잡아서 적절하게 복구되거나, 작업을 중단시키고 개발자에게 통보되어야 한다.
- 예외를 잡아서 (콘솔에 찍고) 아무 조치도 취하지 않는 것을 ‘예외를 먹는다’라고 표현하는데, 가장 좋지 않은 얘외 처리 방식이다.
- 얘외를 무책임하게 throw해서 throw체인을 만드는 것 역시 좋지 않다.
자바 예외 종류
- Error
java.lang.Error 클래스의 서브클래스로, 시스템에 비정상적 상황이 발생했을 때, jvm이 직접 발생시키는 예외이다. 따라서 어플리케이션 코드에서 잡을 이유가 없다.
- Exception
java.lang.Exception 클래스와 그 서브클래스들로, 에러와는 달리 어플리케이션 코드 프로세스 중에 예외상황이 발생한 경우이다. Exception은 다시 checked / unchecked 예외로 나뉘는데, check 예외는 반드시 명시적으로 처리해주어야 하고 unchecked 예외는 명시적으로 처리해 주지 않아도 된다는 차이가 있다.
예외 처리 방법
- 예외 복구
직접 예외를 잡아서 문제를 해결하고 정상 상태로 되돌리는 방법이다. 예를 들어, 네트워크가 불안정한 상황에서 디비 커넥션 로직인 디비 연결에 실패하는 익셉션을 발생시킬 경우, 해당 익셉션을 잡아서 n번 재시도하는 로직을 짤 수 있다.
- 예외처리 회피
예외 처리를 직접 하지 않고 자신을 호출한 쪽으로 던지는 것이다. 메소드의 선언부에 throws 로 던지거나, try / catch로 일단 잡은 뒤 다시 throw하는 방식이 있다.
- 예외 전환
마지막으로 발생한 예외를 잡아서 적절한 예외로 전환해 던지는 것을 예외 전환이라고 한다. 일반적으로 포괄적인 예외를 잡아서 보다 구체적인 예외로 전환해서 던지거나, checked 예외를 unchecked 예외로 전환해서 무의미한 throw chaining을 막기 위해 사용된다.
복구할 수 없는 예외는 가능한 빨리 런타임 예외로 전환하는 것이 좋다.
어플리케이션 로직을 담고 있는 예외 (ex. 아이디 중복 생성 예외) 는 체크 예외로 만들어 처리를 강제하는 것이 좋다.
스프링의 예외 처리
스프링은 추상화 기법을 예외 클래스에도 적용해, 구체적으로 다른 클래스의 예외들이 같은 맥락이라면 내부적으로 같은 추상 예외 클래스로 변환해 주는 기능을 가지고 있다.