자바 | 예외는 던져야 제 맛

송은석·2023년 1월 5일
0

자바에서 예외란 무엇일까요?

자바에서의 예외란 프로그램 상에서 예측했거나 하지 못했던 문제로 인해 프로그램 실행에 영향을 미치는 것을 의미합니다. 개발자는 이를 미리 예측하여 문제를 해결할 수 있습니다.

하지만 예외가 아닌 에러가 발생했을 경우, 이는 시스템 상에서 비정상적인 상황이 발생한 것이므로 이를 애플리케이션 코드에서 잡기 어렵습니다. 주로 JVM 상에서 발생한 요인입니다(OOME, StackOverFlowError)

자바 예외의 3가지

자바에서 예외란 크게 Throwable 클래스를 상속 받은 3종류로 나누어볼 수 있습니다.

첫째는 Error로, 시스템 상의 문제로 인해 자바 프로세스에 영향이 미치는 것을 말합니다. 개발자가 해결하기 어려운 문제입니다.

둘째로 Throwable 클래스를 상속 받은 Exception 클래스를 상속 받은 RuntimeException과 그 하위 클래스들이 있습니다. 다른 말로는 UnChecked Exception이라고도 하는데요, 여기서 Unchecked는 반드시 해당 에러를 try catch 구문을 통해 명시적으로 관리할 필요가 없음을 의미합니다. 컴파일러도 해당 예외에 대해서는 강제하지 않습니다. 하지만 런타임 시 예외가 발생할 가능성이 있습니다. ArrayIndexOutOfBoundsException과 같은 예외가 그 예입니다. 해당 예외는 throw로 호출한 메소드에게 예외를 던지지 않는 행위를 말하기도 합니다.

마지막으로 Exception 클래스를 상속 받았지만 RuntimeException이 아닌 에러를 CheckedException이라고 부릅니다. 해당 에러는 명시적으로 try-catch 문에 의해 관리되어야 할 의무를 가집니다. 혹은 throw와 throws를 통해 호출한 메소드에게 예외를 던져야 합니다. 컴파일러는 이를 검출해냅니다. SQLException, IOException 등이 이에 속합니다.

핵심 키워드

  • try-catch
    • checked 예외에서 사용됨.
    • try 블록에서 예외 발생 시 해당하는 예외가 있는 catch 블록을 찾으며, throw를 통해 호출 메서드들로 전파되었음에도 없을 시 해당 스레드는 끝납니다.
    • catch는 복수로 사용될 수 있으며, 순차적으로 처리되므로 상대적으로 자식 예외 클래스가 먼저 위치해야 합니다. 그렇지 않을 경우 컴파일러 에러가 발생합니다.
      • already been caught
  • throw
    • throw 예약어 이후, 생성한 예외 객체를 두거나 있던 예외 객체를 두면 예외 객체를 던질 수 있습니다. try 구문 안의 문장이었다면 catch에서 예외 객체를 처리할 수 있는 객체를 찾고, 없으면 throws를 통해 호출 메서드에게 예외 처리를 위임할 수 있습니다.
  • throws
    • 메서드에서 발생한 예외 객체를 호출 메서드에 위임합니다.

헷갈렸던 거

  • new 예외 객체 생성 후 - 코드로 이것저것 실행해보다가, 아무런 일이 일어나지 않아서 의아해 했습니다. 그러다가 던지지 않은 예외 객체는 아무 의미가 없다는 걸 깨달았습니다 휴
    또한, throws - throw로 던지고, 해당 메서드의 catch로 받거나 메서드 시그니처에 throws를 통해 호출 메서드로 예외 처리 책임을 위임했을 때 예외 객체의 의미가 생기게 됩니다.

예외 처리의 방식 - 회복, 회피, 전환

회복 - 예외 객체를 특정한 방법으로 정상 처리하는 방법을 뜻합니다. catch로 일단 예외 객체를 잡고, 다시 시도한다던지.. 그러나 실효성을 가지지 못합니다

회피 - throws 를 통해 호출 메서드에 위임하는 것. 그러나 깊게 관련된 객체 사이가 아니라면 이는 좋지 않다. 만약 위임한다면 해당 에러 객체에 대한 정보가 위임 메서드에도 충분해야 한다.

전환 - 회피의 방식인데, 위임을 하기 전에 해당 예외 객체를 보다 상황에 맞게 래핑하는 것. 단순히 더 적절한 예외 객체를 넘기는 방식을 택할 수도 있다.

트랜잭션과 예외

  • 스프링의 트랜잭션 처리의 기본 값은
    • Unchecked 예외 시 롤백 처리

    • Checked 예외 시 롤백 처리 x

      그러나 이것은 기본 동작이며, 어노테이션을 통한 설정으로 특정 Unchecked에 대해 롤백 처리를 하지 않게 하거나, 특정 Checked 예외 시 롤백 처리를 하도록 할 수 있습니다.

  • 따라서 Unchecked 예외 시 롤백 처리가 되고, Checked 예외 시 롤백 처리가 되지 않는다는 말은 맞지 않습니다. 이는 스프링의 기본 설정 값에 불과하며, 설정을 통해 변경할 수 있는 사항이기 때문입니다. 롤백 여부는 개발자의 선택에 의해 좌우될 수 있습니다.

참고

- https://steady-coding.tistory.com/583
- https://madplay.github.io/post/java-checked-unchecked-exceptions
- https://www.youtube.com/watch?v=_WkMhytqoCc&ab_channel=%EB%B0%B1%EA%B8%B0%EC%84%A0
- https://docs.spring.io/spring-framework/docs/4.2.x/spring-framework-reference/html/transaction.html#transaction-declarative-rolling-back
profile
Done is better than perfect🔥

0개의 댓글