https://www.inflearn.com/course/스프링-db-1
자바 예외 이해
예외 계층
- Error 의 경우, 개발자가 잡으려고 하면 안된다.
- Exception 은 CheckedException 이라고 볼 수 있는데, 컴파일러가 자동으로 체크하여 잡아준다.
다만 RuntimeException 의 경우 예외로 UncheckedException 이라고 할 수 있다.
예외 기본 규칙
- 예외는 폭탄 돌리기와 같다. 잡아서 처리하거나, 처리할 수 없으면 밖으로 던져야한다.
- 예외를 처리하지 못하면 호출한 곳으로 계속 던지게 된다.
- 예외를 잡거나 던질 때 지정한 예외뿐만 아니라 그 예외의 자식들도 함께 처리된다.
- 예외를 처리하지 못하고 계속 던지면 어떻게 될까?
- 자바 main() 쓰레드의 경우 예외 로그를 출력하면서 시스템이 종료된다.
- 웹 어플리케이션의 경우 어떤 사용자의 요청을 처리하기 때문에 하나의 예외 때문에 시스템이 종료되면 안된다.
WAS가 해당 예외를 받아서 처리하는데, 주로 사용자에게 개발자가 지정한, 오류 페이지를 보여준다.
체크 예외 기본 이해
- 체크 예외는 잡아서 처리하거나, 또는 밖으로 던지도록 선언해야 한다. 그렇지 않으면 컴파일 오류가 발생한다.
- 체크 예외의 장단점
- 컴파일러가 자동으로 잡아주기 때문에 안전장치 역할을 하게 됨
- 신경쓰지 않고 싶은 예외까지 처리해줘야한다. (다른 라이브러리 사용에 따른 예외 포함)
의존 관계 따른 단점도 있다.
언체크 예외 기본 이해
- 언체크 예외는 체크 예외와 기본적으로 동일하다. 차이가 있다면 예외를 던지는 throws 를 선언하지 않고, 생략할 수 있다.
- 언체크 예외의 장단점
- 신경쓰고 싶지 않은 언체크 예외를 무시할 수 있다. 신경쓰고 싶지 않은 예외의 의존관계를 참조하지 않아도 되는 장점이 있다.
- 언체크 예외는 개발자가 실수로 예외를 누락할 수 있다. 체크 예외는 컴파일러를 통해 예외 누락을 잡아준다 - 체크 예외와 언체크 예외의 차이는 사실 예외를 처리할 수 없을때 예외를 밖으로 던지는 부분에 있다.
체크 예외 활용
- 기본적으로 언체크(런타임) 예외를 사용하자.
- 체크 예외는 비즈니스 로직상 의도적으로 던지는 예외에만 사용하자.
- 이 경우 해당 예외를 잡아서 반드시 처리해야 하는 문제일 때만 체크 예외를 사용해야 한다.
- 체크 예외 예)
- 계좌 이체 실패 예외
- 결제시 포인트 부족 예외
- 로그인 ID, PW 불일치 예외 - 1. 복구 불가능한 예외
2. 의존 관계에 대한 문제
- JDBC 기술이 아닌 JPA 사용하면 SQLException 관련 코드들이 변경되어야 함
-> 서비스 , 컨트롤러 상에 처리 로직 또한 변경해야함 - throws Exception
- 다른 체크 예외를 체크할 수 있는 기능이 무효화 된다.
- anti pattern 이다. 쓰면 안됨
언체크 예외 활용
- 구현 기술이 변경되는 경우, 예외를 공통으로 처리하는 곳에서는 예외에 따른 다른 처리가 필요할 수 있다. 하지만 공통 처리하는 한곳만 변경하면 되기 때문에 변경의 영향 범위는 최소화 된다.
- 런타임 예외는 놓칠 수 있기 때문에 문서화가 중요하다.
예외 포함과 스택 트레이스
- 예외를 전화할때는 꼭! 기존 예외를 포함해야 한다. 그렇지 않으면 스택 트레이스를 확인할 때 심각한 문제가 발생한다.
- throwable을 파라미터로 하는 생성자를 포함하여, 반드시 기존 Exception 을 포함하자.
'Spring' 카테고리의 다른 글
[Spring] 재고시스템으로 알아보는 동시성 이슈 해결방법 (0) | 2023.03.19 |
---|---|
[Spring] 스프링 DB 1편 - 데이터 접근 핵심 원리 - 5 (0) | 2022.10.30 |
[Spring] 스프링 DB 1편 - 데이터 접근 핵심 원리 - 3 (1) | 2022.10.01 |
[Spring] 스프링 DB 1편 - 데이터 접근 핵심 원리 - 2 (0) | 2022.09.18 |
[Spring] 스프링 DB 1편 - 데이터 접근 핵심 원리 - 1 (0) | 2022.06.06 |