Checked Exception vs UnChecked Exception
개발을 하다보면 진짜 별의별 에러를 다 마주친다.
그나마 컴파일 에러로 IDE에서 잡아주면 다행이지만 런타임 에러는 실행시켜보고 여러 가지 테스트를 해봐야 에러를 마주할 수 있고 예외 처리를 할 수 있다.
우리는 이것을 에러, 예외라고 부르며 공통적으로는 Exception이라고 부른다.
이 Exception도 두 부류로 나뉠 수 있다는 것을 이번에 알게 되었다.
또한 이 Exception 부류로 인해 기본 transaction 처리를 할 수 있게 된다.
Checked Exception
외부 요인에 의해 발생할 수 있는 Exception이다.
RuntimeException 자시 자신을 포함해 상속 받지 않은 모든 Exception들이 해당된다. (Exception또한 checked Exception에 해당한다.)
컴파일 중에 예외 처리가 필요한지 안 한지 IDE가 판단해주고 무조건 try-catch나 throw로 예외처리를 하라고 강제한다.
또한 이 예외가 발생했을 경우기본적으로 transaction 처리가 되지 않아서 transaction 처리를 하기 위해서는 별도 설정을 해야한다.
즉, 예외가 발생해도 rollback 처리 되지 않는다.
제일 자주 볼 수 있는 Checked Exception은 아래와 같은 FileNotFoundException이다.
이와 같이 외부의 영향을 받을 수 있는 에러가 바로 컴파일 단계에서 미리 IDE가 예외 처리의 필요성을 체크할 수 있어서 Checked Exception이라고 한다.
UnChecked Exception
Check Exception과 반대로 내부 요인에 의해 발생할 수 있는 Exception을 의미한다.
RuntimeException 자신을 포함해 상속 받은 모든 하위 Exception을 의미한다. 따라서 Runtime Exception이라고도 할 수 있다.
(참고로 RuntimeException 또한 Exception을 상속 받은 객체이다.)
런타임에서 에러를 확인할 수 있기 때문에 컴파일 단계에서 미리 예외를 체크할 수 없다.
(그래서 이름이 UnChecked Exception이다.)
이 예외에 대해서는 기본적으로 transaction을 처리해줘서 예외가 발생하면 rollback이 된다.
unchecked exception은 아래와 같이 배열을 사용할 때 많이 발생한다.
List<String> l = new ArrayList<String>();
System.out.println(l.get(0));
위 코드를 실행시키면 아래와 같이 IndexOutOfBoundsException이 발생한다.
이와 같이 직접 실행을 시키고 여러 변수들을 테스트 했을 때 발생할 수 있는 예외를 unchecked exception이라고 한다.
IDE가 미리 체크할 수 없으므로 개발자가 직접 여러 가지 경우의 수를 생각해서 예외 처리를 해줘야 한다.
Checked Exception vs UnChecked Exception
checked exception과 unchecked exception의 차이점을 간단하게 정리하면 아래와 같다.
checked exception | unchecked exception (runtime exception) |
RuntimeException을 상속받지 않은 모든 Exception | RuntimeException을 포함한 RuntimeExcpetion을 상속받은 모든 Exception |
Compile(컴파일) 단계에서 체크 가능 | Runtime(런타임) 단계에서 체크 가능 |
IDE가 컴파일 단계에서 체크해 예외 처리를 강제 시킨다 | 런타임에서 발견할 수 있으므로 개발자가 여러 경우의 수를 생각하고 에외 처리를 해야 한다 |
Transactional 처리 시 기본 rollback 처리를 하지 않는다 | Transactional 처리 시 기본 rollback 처리를 한다. |
어찌보면 간단할 수 있지만 개발을 하다보면 Exception에 따라 특히 rollback 처리 설정을 해줘야하므로 이 정도 정보는 알고 있어야겠다.
아니면 transactional 처리를 했는데 왜 rollback이 안 되냐고 삽질을 할 수 있다 😥😥
✋ Exception Document
https://docs.oracle.com/javase/7/docs/api/java/lang/Exception.html
✋ RuntimeException Document
https://docs.oracle.com/javase/7/docs/api/java/lang/RuntimeException.html