프로그래밍 언어/JAVA(자바)

JAVA Exception 개념 (Checked Exception/UnChecked Exception/Error)

냠냠:) 2024. 2. 13. 12:05

1. 자바 예외(Exception) 종류

  • 예외(Exception)
    • 체크 예외(Checked Exception)
    • 언체크 예외(Unchecked Exception)
  • 에러(Error)

자바에서 예외는 크게 Trowable 클래스를 상속받은 Error와 Exception으로 나눌 수 있다.

Error는 개발자가 제어할 수 없는 시스템 레벨 예외이다.

Java에서의 Exception은 Runtime Exception과 Exception으로 나눌 수 있고, 언체크 예외는 Runtime Exception로, 체크 예외는 Exception으로 구분한다.






2. Checked Exception, Unchecked Exception, Error 특징

체크예외(Checked Exception)

java.lang.Exception 클래스의 서브 클래스 중, RuntimeException를 상속받지 않은 Exception 클래스들이다.

체크 예외는 기존 프로세스의 복구 가능성 의미하는 예외이므로, 필수적으로 try-catch 문으로 해당 예외를 처리해야한다. catch 문에는 try 문에서 진행된 프로세스의 예외상황을 복구한다.

try-catch문에서 예외를 잡지 않거나, 메서드 레벨에 throws 문을 사용하지 않으면 컴파일 에러가 난다.

위 스크린샷에서 보는 것처럼, Exception 클래스의 서브 클래스인 FileNotFoundException은 예외처리를 필요로한다.




언체크 예외(Unchecked Exception)

java.lang.Exception 클래스의 서브 클래스인 RuntimeException을 상속받은 클래스들이다.

체크 예외와 반대로 복구 가능성이 없는 예외를 의미하므로, 컴파일 시점에 예외처리를 강제하지 않는다.

RuntimeException은 Exception의 서브 클래스다. 하지만 예외처리 구분에 있어서 RuntimeException의 서브 클래스들은 Unchecked Exception으로 분류되는 것을 기억하자.




에러(Error)

java.lang.Error 클래스의 서브 클래스다. 에러는 시스템 레벨에서, 주로 메모리가 부족하거나, 클래스 및 메서드를 찾지 못하는 등 애플리케이션과 별개로 비정상적인 상황인 경우에 발생한다. NoSuchMethodError, OutOfMemoryError 에러가 Error에 포함된다.

에러가 발생한다면, 원인이 시스템 레벨에서 발생했다는 정도는 알 수 있지만 애플리케이션 레벨에서 처리할 수 있는 것은 없다.






3. 예외처리 방법

예외를 처리하는 방법에는 예외복구, 예외처리 회피, 예외 전환이 있다.

예외 복구

예외가 발생할 상황을 파악하고, 예외를 해결하여 정상적인 상태로 돌려놓는 것이다.
예외가 발생하여 정상적인 상태로 복구가 불가능하다면, 다른 작업 흐름으로 자연스럽게 유도해주어 정상으로 돌아오도록 하는 방법이다.

개발자가 예외를 직접 복구하는 로직을 만들거나, Spring-retry같은 API 및 어노테이션을 사용하는 것도 방법이다.




예외처리 회피

자바에서 예외는 메서드에서 발생하게 된다. 예외처리 회피는 예외가 발생한 메서드에서 자신을 호출한 메서드로 예외를 던지는 방식이다.

그렇게 된다면 예외가 발생한 메서드에서는 예외를 처리할 책임이 없으므로, 호출한 메서드에서 해당 예외를 처리해야한다. 호출한 메서드는 try-catch로 예외를 처리할지, 한 번 더 예외처리를 회피할 지 결정할 수 있다.

자바는 객체의 역할마다 처리해야하는 책임이 존재하는 객체지향언어다. 무작정 예외를 넘겨주는 것은 무책임한 회피가 될 수 있으므로 상황에 따라 적절하게 사용해야 한다.




예외 전환

추상화된 예외로 바꾸는 경우

  • 발생한 예외를 적절히 다른 예외로 변환하여 던진다. 일반적으로 호출한 쪽에서 예외를 받아서 처리할 때 좀 더 명확하게 인지할 수 있도록 하기위한 방법이다.

RuntimeException으로 전환하여 불필요한 예외처리를 줄여주는 경우

  • CheckedException 처럼 복구 불가능 Exception을 UncheckedException으로 전환하여 호출한 메서드 측에서 CheckedException을 일일히 선언하지 않아도 되게 할 수도 있다.




4. 마지막으로..

Exception을 단순히 하나의 비정상 동작으로 볼 것인지 아닌지의 차이가 중요하다고 생각한다. 한 때 모든 try-catch문의 예외를 Exception으로만 잡은 것을 반성하게되고, 예외처리를 상세히 할지 또는 추상적으로 처리해야할지에 대한 고민도 늘게 되었다.

다음 포스트는 실제 실무적으로 내가 겪은 트랜잭션 문제상황과 해결한 방향을 중점적으로 작성해봐야겠다.

반응형