💻본 포스팅은 '스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 - 김영한'님의 강의를 듣고 작성되었습니다.
목차
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. 체크 예외와 언체크 예외의 차이
처리를 할 수 없을 때 예외를 밖으로 던지는 부분에 차이가 있다. 이 부분을 필수 선언 해야 한다면 체크 예외이고 선언하지 않고 생략한다면 언체크 예외이다.
'Back-End > Spring' 카테고리의 다른 글
스프링 - @Aspect AOP(부제: 스프링 내에서 프록시 적용을 쉽게 해주는 @Aspect ) (0) | 2023.03.17 |
---|---|
[Spring DB][자바 예외] - 체크, 언체크 예외의 활용 그리고 예외 포함 스택 트레이스 (0) | 2022.07.20 |
[Spring DB][커넥션풀과 데이터소스 이해] - DataSource의 이해 (0) | 2022.06.24 |
[Spring DB][커넥션풀과 데이터소스 이해] - 커넥션풀과 데이터소스란 무엇인가? (0) | 2022.06.22 |
[Spring DB][JDBC 이해] - JDBC 사용 (0) | 2022.06.22 |