오류 vs 예외
오류(Error)는 시스템에 비정상적인 상황을 의미합니다. 이런 오류는 개발자가 미리 예측할 수 없으므로 오류 처리에 대한 신경을 쓰지 않아도 됩니다.
예외(Exception)는 개발자가 구현한 로직에서 발생합니다. 즉, 예외는 발생할 상황을 미리 예측하여 처리할 수 있기 때문에 예외를 구분하고 그에 따른 처리 방법을 명확히 알아야 합니다.
예외 클래스
모든 예외 클래스는 Throwable 클래스를 상속받습니다. 그 중 Exception의 Checked Exception과 RuntimeException의 차이는 뭘까요?
Checked Exception과 RuntimeException(Unchecked Exception)의 가장 분명한 차이는 “반드시 처리해야 하느냐”입니다.
Checked Exception은 컴파일 시 검사하는 예외입니다. 발생 가능성이 있다면 try/catch로 처리하거나 throws로 예외 처리를 떠넘길 수 있습니다.
RuntimeException(Unchecked Exception)은 런타임에 발생하는 예외이기 때문에 RuntimeException이라고 부릅니다.
예외 처리
예외 처리는 크게 세 가지 방식으로 가능합니다.
- try - catch 처리
- 예외 처리 회피
- 예외 변환
이 세 가지 방법 중 예외 변환은 생소할 수 있어 예제 코드로 설명드리겠습니다. 예외 변환이란 예를들어 Checked Exception을 더 명확하게 정의된 Custom Exception으로 변환하는 작업이라고 할 수 있겠습니다. 기본적으로 Checked Exception이 가진 정보는 다소 불친절할 수 있기 때문입니다.
Spring에서는 모든 SQLException을 DataAccessException으로 포장해서 던져줍니다. SQLException은 CheckedException에 속하는데 이를 예외 전환 방식을 이용하여 DataAccessException (RuntimeException)으로 변환한 것입니다.
왜 SQLException을 변환했을까요? SQLException은 통제할 수 없는 외부 요인(클라이언트의 요청)이나 프로그램의 오류, DB 문제, 개발자의 부주의에 의해서 발생하는 복구할 수 없는 예외입니다.
SQLException이 발생하는 경우
- SQL 문법이 틀린 경우
- 제약조건을 위반한 경우
- DB 서버가 다운된 경우
- 네트워크 불안정
- DB 커넥션 풀
즉, 코드 레벨에서 적절하게 대처하기가 번거롭습니다. 또한 사용하는 DB에 따라서 예외 코드조차 다른 경우도 많습니다. 따라서 이를 애플리케이션 레벨에서 신경쓰지 않고, 개발자가 빨리 알아차릴 수 있도록 상세한 정보를 담은 예외(DataAccessException)로 변환해주는 것입니다.
그리고 이처럼 Unchecked Exception으로 변환해주면 개발자 입장에서 try-catch나 throws로 명시적으로 처리해주지 않아도 되기 때문에 코드를 더욱 깔끔하게 유지할 수 있다는 장점이 있습니다.
Ref
"DAO 리팩토링 5 - SQLException을 DataAccessException으로 래핑" 부분
자바 언어가 등장하면서 장점 중의 하나가Exception 클래스의 도입이었다.
그런데 CheckedException이 남용되면서 소스 코드가 지저분해지는 경향이 생기면서
최근에는 CheckedException의 사용을 최소화하자는 방향으로 흐름이 바뀌였다.
하지만 기존 API에는 수 많은 CheckedException이 있다.
이 CheckedException을 그대로 사용하는 것이 아니라 UnCheckedException(RuntimeException)으로
래핑해서 사용하는 것이 더 깔끔한 코드를 유지하는데 도움이 된다.
As this class is a runtime exception,
there is no need for user code to catch it
or subclasses if any error is to be considered fatal (the usual case).
'JAVA' 카테고리의 다른 글
제네릭 (Contravariant, PECS, Type erasure, Heap pollution with varargs) (1) | 2022.11.04 |
---|---|
java for, for-each, forEach 성능 비교, 장단점, 특징 정리 (0) | 2022.10.26 |
Java.nio Selector의 필요성 (0) | 2022.09.20 |
[기본 시리즈] java.nio 버퍼 (1) | 2022.09.19 |
[기본 시리즈] JAVA 스레드에 대하여 (0) | 2022.09.08 |