Checked Exception, Unchecked Exception 언제 써야 할까?
JAVA의 Checked Exception, Unchecked Exception(Runtime Exception) 두 사이의 Exception 중 과연 어떤걸 써야할지에 대해서 고민해보고 정리해보겠습니다.
생각 정리에 앞서 간단하게 분리를 해보겠습니다.
Checked Exception | Unchecked Exception |
예외 처리가 필요한 예외 임으로 반드시 예외를 처리가 필요하여 try - catch를 강제적으로 수행하게 됨 |
예외처리를 강제하지 않는다. |
컴파일 시점에서 검사 | 런타임 시점에서 검사 |
RuntimeException을 상속받지 않은 Exception | RuntimeException 을 상속하여 만들어짐 |
언뜻 보면 Checked Exception은 모든 예외처리에 대한 검사를 강제하여 복구를 유도하겠끔 하여 긍정적인 효과가 이루어질꺼 같지만...
현실세계에서는 실질적으로 처리하지(복구하지) 못하는 예외가 많음, 처리를 할 수 없기에 로그만 남기는 수준에 처리가 이루어 짐
* 대표적인 사례로 SQL Exception의 검색해보면 흥미로운 내용이 많다.
이럴 경우 무분별한 Checked Exception은 try - catch만 남기고 처리를 미룬다면 쓸데없는 throws만 생기어 해당 계층 간의 관심사가 분리되어 논리가 끊기는 현상이 발생된다. (별 의미없는 Checked Exception이 발생되는 메서드를 사용한다고 생각해보자)
결론
- 정말 해당 사항을 복구할 수 있고 꼭 복구를 해야한다면 심사숙고에서 Checked Exception를 도입
- 기본 전략을 런타임 익셉션(Unchecked Exception)을 사용
- 프레임워크 혹은 라이브러리 단에서 Checked Exception이 발생한다면 복구할 수 없다면 차라리 Checked Exception을 구체적인 Unchecked Exception으로 랩핑하여 클라이언트에 메시지를 보여주거나 재처리를 유도 하는 것이 오히려 효과적이라고 생각한다.