목차 >> Exception 처리 
+- Exception 처리  
+- GlueException

11장 Exception 처리

Exception 처리

예외(Exception)란 의도한 대로 프로그램이 진행되지 않고 다른 상황으로 진행되는 것을 말합니다. 이런 예외가 발생 했을 때 적절한 조치를 취해 줄 수 있는 절차를 구현하도록 문법을 정의한 것을 예외 처리라 합니다.
자바가 다른 언어와 크게 다른 것이 이 예외를 처리하는 과정입니다. 자바에서는 Checked Exception과 Unchecked Exception 두 가지 방법을 지원함으로써 예외 처리를 컴파일 시점과 런타임 시점에 나눠서 처리할 수 있습니다.
Exception의 상황에 따라 적절히 사용되어야 함에도 불구하고 지금까지 자바 진영에서는 Checked Exception의 장점만을 너무 강조함으로써 Checked Exception을 무분별하게 사용하고 있습니다. 무분별한 Checked Exception의 사용은 다음과 같은 단점을 가져 올 수 있습니다.

  • 소스 코드의 복잡도 증가
  • 소스 코드의 가독성(Readability) 저하, 유지보수 저하
  • 비즈니스적인 Exception을 제외하고 개발자가 처리할 수 있는 것은 상당히 제한적

자바의 Checked Exception은 java.lang.Exception을 상속한 Exception으로 컴파일 시점에 이 Exception을 try~catch 구문으로 처리하지 않을 경우 컴파일 에러가 발생한합니다. 그러므로, 컴파일 시점에 메소드에서 발생하는 Exception 처리가 제대로 구현되어 있는지를 확인하는 것이 가능합니다. 예를 들어 java.io.IOException이 대표적인 Checked Exception 입니다.
Unchecked Exception은 java.lang.RuntimeException을 상속한 Exception으로 컴파일 시점에 try~catch 구문으로 처리하지 않아도 컴파일 에러가 발생하지 않습니다. 단, 런타임 시점에 에러가 발생할 경우 Unchecked Exception이 발생하게 되는 것입니다. 예를 들어, java.lang.NullPointerException이 대표적인 Unchecked Exception입니다.

그림 : Checked Exception vs Unchecked Exception
Checked Exception vs Unchecked Exception

GlueException

Glue Framework에서는 다음과 같은 경우를 제외하고는 Unchecked Exception 을 사용합니다.

  • 회복 가능한 에러가 발생한 경우
  • 모든 호출자들이 발생되는 Exception을 꼭 처리해야 하는 경우

GlueException은 java.lang.RuntimeException을 확장한 Unchecked Exception으로써 Glue Framework에서 사용하는 최상위 Exception입니다. GlueException의 subclass는 그림과 같습니다.

그림 : GlueException
GlueException

Glue Framework의 단위 프로그램은 아래와 같은 layer를 갖습니다. Controller layer에서 Glue Service를 실행됩니다. Glue Service에 정의된 GlueActivity가 순서대로 실행되며, Glue Activity에서 DAO, Cache Manager 등등의 Component를 사용합니다.
실제 구현하게 될 Activity에서의 Exception 처리(try ~ catch)를 하지 않아도 됩니다. 다만, DAO 또는 다른 Component에서 발생되는 Exception이 비즈니스적인 처리가 필요할 경우는 try~catch 구문을 사용할 수 있으며, Controller Layer에서의 처리가 필요할 경우 해당 Exception을 GlueException으로 re-throw 하면 됩니다.

그림 : layer별 Exception 처리
layer별 Exception 처리

제공되는 예제 'sample-hello-exception' 을 통해 응용해 보시기 바랍니다.

  • Case 1 : Activity에서 Exception 발생. failure 없음. controller layer에서 Exception 처리함.
  • Case 2 : Activity에서 Exception 처리함.
  • Case 3 : Activity에서 Exception 발생(또는 re-throw). failure 있음. Next Activity에서 Exception 처리함.