Back-End/Spring

[Spring DB][자바 예외] - 자바의 예외 이해

얄루몬 2022. 7. 12. 19:21

💻본 포스팅은 '스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 - 김영한'님의 강의를 듣고 작성되었습니다.

https://inf.run/As6W

 

스프링 DB 1편 - 데이터 접근 핵심 원리 - 인프런 | 강의

백엔드 개발에 필요한 DB 데이터 접근 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 DB 접근 기술의 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., - 강의

www.inflearn.com


목차
1. 자바 예외의 계층
2. 예외의 기본 규칙
3. 체크 예외의 기본 이해
4. 언체크 예외의 기본 이해
5. 체크 예외와 언체크 예외의 차이

1. 자바 예외의 계층

  • 자바에서 객체의 최고 조상이 object이기에 예외의 최상이 부모 역시 Object이다.
  • 예외의 최상위 예외는 Throwable이다.
    • 개발자는 Throwable 예외를 잡으면 안 된다. 그 이유는 조상 예외를 잡으면 하위 예외까지 잡혀버리기 때문이다. 
    • Error
      • 메모리 부족, 심각한 시스템의 오류와 같이 애플리케이션에서 복구 불가능한 시스템 예외를 Error라고 한다.
      • 애플리케이션 개발자는 이 예외를 잡으려고 해서 안 된다.
    • Exception(체크 예외)
      • 애플리케이션 로직에서 사용할 수 있는 실질적인 최상위 예외이다.
      • 컴파일러가 체크하는 체크 예외이다. 이때 Exception의 하위 예외인 RuntimeException의 경우엔 예외로 한다.
        • 컴파일러가 예외를 체크하기 때문에 체크 예외라고 한다.
    • RuntimeException(언체크 예외) - 보통 런타임 예외라고 하면 언체크 예외이다.
      • 컴파일러가 체크하지 않는 언체크 예외이다.
        • 컴파일러가 체크하지 않아서 언체크 예외라고 부른다.
      • RuntimeException과 그 자식 예외는 모두 언체크 예외이다.

2. 예외의 기본 규칙

예외가 발생했다면 잡아서 처리하거나, 처리할 수 없다면 밖으로 던져야한다.

예외를 처리해서 정상 흐름을 반환하는 경우

 

예외를 계속 던지는 경우

예외 처리의 기본 2가지 규칙

  • 예외가 발생했다면 처리하거나 예외를 계속 던지거나 해야 한다.
  • 예외를 처리하거나 던지는 경우엔 지정 예외의 하위 예외까지 함께 처리하고 던져진다.

예외를 처리하지 않고 계속 던진다면?

  • 기본 main 쓰레드를 호출한 경우라면 시스템이 종료된다.
  • 웹 애플리케이션의 경우엔 여러 쓰레드를 사용하고 있고 또한 예외를 처리하지 못해 서버가 종료되는 문제가 발생해서는 안 되기 때문에 WAS에서 해당 예외를 받아 처리해준다.
    • 즉, 예외 발생때문에 서버가 종료되는 일은 없다는 뜻이다.
    • WAS가 지정 예외와 관련된 페이지를 보여준다. (앞서 살펴본 MVC포스팅에 예외 처리와 페이지 처리 관련 포스팅이 있다!!)

3. 체크 예외의 기본 이해

  • Exception과 그 하위 예외는 모두 컴파일러가 체크하는 체크 예외로 이때 RuntimeError는 언체크 예외로 예외한다.
  • 체크 예외는 잡아서 처리하거나 밖으로 던지도록 선언해야 한다.
    • 그렇지 않으면 컴파일 오류가 발생한다.
  • throws Exception은 좋지 않음 조금 더 구체적인 예외를 던지는 것이 좋다.

controller -> service -> repository 계층이 있다고 가정했을 때 repository에서 예외가 발생하고 service에서 이 객체를 사용하고자 할 때 예외를 처리하거나, 던지는 방법을 사용해야 한다.

이때 예외를 던지는 경우라면 밖으로 던지는 것을 꼭 선언해주어야 한다!

체크 예외의 장단점

  • 장점
    • 개발자가 실수로 에외를 누락하지 않도록 컴파일러를 통해 문제를 잡아주는 훌륭한 안전 장치가 된다.
  • 단점
    • 실제로는 개발자가 모든 체크 예외를 반드시 잡거나 던지도록 처리해야 하기 때문에, 너무 번거로운 일이 된다.
    • 추가로 의존관계에 따른 단점도 있다. (뒤에서 설명)

Exception을 상속받는 예외는 체크 예외가 된다.

4. 언체크 예외의 기본 이해

  • Exception의 하위 예외인 RuntimeException의 경우엔 언체크 예외로 분류된다.
  • 언체크 예외는 말 그대로 컴파일러가 예외를 체크하지 않는다는 뜻이다.
  • 언체크 예외는 기본적으로 체크 예외와 동일하지만 throw를 선언하지 않고 예외를 던질 수 있다. (이 경우 자동으로 예외를 던진다.)

언체크 예외의 장단점

  • 장점
    • 신경쓰고 싶지 않은 언체크 예외를 무시할 수 있다.
    • 선언부에 throws를 사용하지 않고도 예외를 던질 수 있다.
    • 신경쓰고 싶지 않은 예외의 의존관계를 참조하지 않아도 된다는 장점이 있다.
  • 단점
    • 언체크 예외는 컴파일러 측에서 예외를 체크하지 않기 때문에 개발자의 실수로 예외 누락이 발생할 수 있다. (그러나 체크 예외는 컴파일러 측에서 예외를 체크해주기 때문에 예외 누락을 잡아준다.)

5. 체크 예외와 언체크 예외의 차이

처리를 할 수 없을 때 예외를 밖으로 던지는 부분에 차이가 있다. 이 부분을 필수 선언 해야 한다면 체크 예외이고 선언하지 않고 생략한다면 언체크 예외이다.