이번 포스트에서는 Exception에 대한 이야기를 써보려고 한다.
요즘 프로그래밍을 배우는 개발자들을 보면 Exception의 처리를 중요시하지 않는 경우가 많다. 또 Exception이 무엇인지 질문하게 되면 제대로 대답하는 이들이 적다.
단순히 Exception 암기 방식으로 몇가지 예외를 외우고 해당 서비스를 구현할 때 try/catch문을 사용하는 공식적인 공부를 하는 것 같다.
이 포스트를 통해 Exception에 대해 알아보자. 먼저 Error와 Exception이 무엇이 다른지를 알아야 한다.
● Error와 Exception는 어떻게 다를까?
- 오류(Error)는 시스템 레벨에서 발생하며 심각한 수준의 오류이다. 시스템에 비정상적인 상황이 발생한 경우이며, 개발자가 미리 예측하여 대비할 수 없기 때문에 개발자 입장에서는 오류에 대한 처리를 신경 쓰지 않아도 된다. 예를 들면, 컴파일 시 문법적인 오류, 포인터 참조 오류, 메모리 부족 오류 등등.
- 예외(Exception)는 컴퓨터 시스템의 동작 도중 예측하지 못한 상태가 발생하여 수행 중인 애플리케이션이 영향을 받는 것, 개발자가 미리 예측이 가능하며, 개발자가 처리할 수 있기 때문에 예외를 구분하고 처리 방법을 명시하여 대비할 수 있다, 예를 들면, Input값이 널로 들어오는 경우 등등
Exception의 하위구조에는 여러 가지의 Exception 종류가 있다 아래는 예외 클래스의 구조를 간단하게 표현하고 있는 그림이다.
Throwable를 상속받는 클래스 중에 Exception 클래스가 있다. 이 Exception도 수많은 자식 클래스를 가지고 있는데 그중에 RuntimeException이 중요하다.
RuntimeException은 Exception이 CheckedException이냐 UncheckedException이냐를 구분하는 기준이다.
Exception의 자식 클래스 중에 RuntimeException을 제외한 모든 Exception은 CheckedException이고, RuntimeException과 자식 클래스들은 UncheckedException이다.
● CheckedException과 UncheckedException(Runtime) 차이.
CheckedException | UncheckedException | |
---|---|---|
처리여부 | 반드시 예외를 처리해야 함(필수) | 예외 처리를 하지 않아도 된다. (선택) |
확인여부 | 컴파일 중에 체크 | 런타임(서비스 진행)중에 체크 |
예외 발생시 트랙젝션 처리여부 | 롤백이 되지 않는다. | 롤백이 된다. |
발생 | 외부 영향으로 발생 (사용자 동작, 운영체제 등) | 개발자의 실수, 도메인 문제 등 |
예외 종류 | Exception을 상속받는 클래스 - IOException - SQLException | RuntimeException을 상속받는 클래스 - NullPointerException - SystemException - IndexOutOfBoundException - CustomException |
위의 표에서 가장 중요한 것은 처리여부
와 예외 발생 시 트랜젝션 처리 여부
이 두 가지이다.
꼭 처리를 해야 하는 CheckedException의 경우는 try/catch문으로 예외를 처리해주어야 하는 반면에 UncheckedException은 꼭 처리를 하지 않아도 된다. 하지만 서비스 도메인에 문제를 주거나 서비스를 하는데에 있어 문제가 발생할 수 있다.
두 번째로 트랙잭션 여부이다. 기본적으로 CheckedException이 발생하면 트랜잭션이 roll-back하지 않고 예외를 Throw 하게 된다. 하지만 UncheckedException은 예외 발생 시 트랜잭션을 roll-back 한다는 점이다. 개발자가 개발하면서 Exception 트랙잭션 여부를 알아야만 실행결과가 맞지 않거나 예상치 못한 예외가 발생하는 것을 방지할 수 있다.
'Java > Java' 카테고리의 다른 글
JUL (java.util.logging) vs Log4j2 vs SLfj2 비교하기. (1) | 2023.12.07 |
---|---|
[Java] InvalidKeyException AES 256 암호화 에러 (0) | 2022.02.10 |
[Java] Log4j 원격코드실행 이슈 JNDI injection (0) | 2021.12.30 |