예외를 처리할 때 핵심원칙 - 모든 예외는 적절하게 복구되든지 아니면 작업을 중단시키고 운영자 또는 개발자에게 분명하게 통보돼야한다.
예외 블랙홀 - Catch 구문에서 아무것도 안하면 안된다.
무의미하고 무책임한 throws - 무조건 throws 시키면 안된다
Error - java.lang.Error 의 에러들. OutOfMemory 나 ThreadDeath 같은 에러는 catch 블록으로 잡아봤자 대응 방법이 없기 때문에, 이에 대한 처리는 신경쓰지 않아도 된다.
Exception과 체크 예외 - java.lang.Exception - 개발자들이 만든 애플리케이션 코드의 작업 중에 예외상황이 발생했을 경우에 사용된다. Exception은 체크예외와 언체크 예외로 구분된다.
체크 예외 - RuntimeException을 상속하지 않는 것들 - 반드시 예외를 처리하는 코드를 함께 작성해야 한다. catch문으로 잡든지 아니면 throws를 정의해서 메소드 밖으로 던져야 한다. 그렇지 않으면 컴파일 에러가 발생한다.
언체크예외- RuntimeException을 상속하는 것들 - catch나 throws로 안잡아도 되고, 잡아도 된다. 피할 수 있지만 개발자가 부주의해서 발생할 수 있는 경우에 발생하도록 만든 것이 런타임 예외
요즘에는 예상가능한 예외를 체크 예외로 만들지 않는 경향이 있기도 하다.
예외 처리 방법
예외 복구 - 예외 상황을 파악하고 문제를 해결해서 정상 상태로 돌려놓는 것(사용자에게 문제를 알려줌)
파일이 안읽히는 경우(IOException) - 경로가 잘못되거나 읽을 수 없다는 것을 사용자에게 알려줌
DB연결 실패(SQLException) - 재시도하도록 하고, 최대 재시도 횟수까지 연결이 안되면 직접 예외 발생
예외 처리 회피 - 자신을 호출한 쪽으로 던져버리는 것 - 템플릿/콜백 처럼 책임과 역할을 분담하고 있는 경우, 예외 처리를 다른 곳에서 처리한다.
예외 전환 - 다른 예외로 전환하여 던진다는 특징이 있음
목적 1. 의미를 분명하게 해줄 수 있는 예외로 바꿔주기 위해서 사용한다
→ 중첩예외( 원래 예외를 포함하는 방식으로 사용하자)
다른 예외를 던지는 방법
포장하는 방법( 체크 예외를 런타임 예외로 바꾸는 경우에 사용한다.)
EJBException → 문제가 생겼을 때, EJBException을 던지면, EJB에서 해당 트랜잭션을 롤백시켜준다.
예외처리 전략
- 런타임 예외의 보편화
- 예외 발생하기 전에 미리 파악하고, 예외가 발생하지 않도록 차단
- 해당 요청의 작업을 취소하고 서버 관리자나 개발자에게 통보
낙관적인 예외 - 런타임
비관적인 예외 - 일단 잡고 보도록 강제하는 체크 예외
애플리케이션 예외 - 애플리케이션 자체의 로직에 의해 의도적으로 발생시키고, catch하여 조치를 취하도록 요구하는 예외
jdbcTemplate → SQLException을 언체크/런타임 예외로 전환해줘야 한다.
예외 전환
- 런타임 예외로 포장해서, 굳이 필요하지 않은 catch/throw를 줄여주는 것
- 더 의미 있고 추상화된 예외로 바꿔서 던져주는 것
jdbc의 한계→ db 종류마다 다르게 접근해야함( 그래서 Jpa가 나온 것으로 알고 있는데..)
비표준 Sql → 대부분의 Db에는 비표준 문법과 기능을 제공
호환성없는 SQLException의 DB정보 →DB마다 Sql이 다를 뿐만 아니라, 에러의 종류와 원인도 제각각 → DB에서 JDBC에 에러를 제대로 주지 않을 수도 있어서, 이것을 믿고 코드를 작성하는 것은 위험
DB 에러 코드 매핑을 통한 전환
키 값 중복 오류의 경우, MySQL은 1062, 오라클이라면 1, DB2라면 -803이라는 에러 코드를 받게 된다. → 이것을 알고 있으면, DuplicateKeyException으로 바꿔줄 수 있다.
이렇게 해서 DataAcessExcpetion을 상속받은 다양한 예외 클래스를 정의하고 있다.
DB별로 에러 코드 정보가 매핑 파일에 담겨 있다.
처리하고 싶은 예외가 있는 경우 → 처리안해도 되지만 처리하려면 try catch 문을 사용하고, method에 throws Exception처리를 해주면 된다.
JPA,Hibernate, JDO → 구현 기술마다 던지는 예외가 다르다
기술에 독립적인 UserDao만들기 →테스트시 예외 처리에 있어서, 각자의 구현 기술마다 뱉는 예외가 다르다
'공부기록 > Spring' 카테고리의 다른 글
토비의 스프링 13장 - 스프링 웹 기술과 스프링 MVC (0) | 2021.11.07 |
---|---|
토비 스프링 5장 - 서비스 추상화 (0) | 2021.10.27 |
토비의 스프링 3장- 템플릿 (0) | 2021.10.16 |
토비의 스프링 1장 (0) | 2021.10.09 |
Spring Framework Overview (0) | 2021.09.27 |