모든 예외는 적절하게 복구되던지 작업을 중단시키고 운영자/개발자에게 통보되어야 한다
예외처리의 안좋은 예 2가지
- 예외 무시
- 예외처리 코드에서 아무 동작 X / 예외 출력만 함
- 무분별한
throws Exception
4.2.1 예외의 종류와 특징
- Error
- java.lang.Error 서브클래스
- 시스템에 비정상적인 상황이 발생했을 때 사용
- 대응방법 없으니 신경 ㄴㄴ
- Exception과 체크 예외
- 개발자들이 만든 애플리케이션 코드의 작업 중 예외상황이 발생했을 경우
- catch문으로 잡는다 or throws를 정의해서 던진다 → 안하면 컴파일에러
- RuntimeException과 언체크/런타임 예외
- 프로그램의 오류가 있을 때 발생하도록 의도된 것들
NullPointException,IllegalArgumentException, …
체크예외 / 언체크 예외
체크 예외 : Exception 클래스의 서브클래스 + RuntimeException 클래스 상속 X
언체크 예외 : RuntimeExceptoin을 상속한 클래스
4.1.3 예외처리 방법
- 예외 복구
- 예외 상황을 파악하고 문제를 해결해서 정상상태로 돌려놓는 것
- 예외상황이 발생할 수 있음을 인식하도록 도와주고 이에 대한 처리를 시도하도록 요구
- 예외처리 회피
- 예외처리를 자신이 담당하지 않고 호출한쪽으로 던지는 것
- throws문 or catch문으로 예외 잡고 다시 rethrows
- 그냥 던지는건 무책임한 책임 회피, 회피할땐 의도가 분명해야 함
- 예외 전환
- 예외를 복구해서 정상적인 상태로 만들 수 없으니 메소드 밖으로 던지는 것
- 발생한 예외를 그대로 넘기는게 아니라 적절한 예외로 전환해서 던짐
- 중첩예외 이용
- 의미를 분명하게 하고, 예외를 처리하기 쉽고 단순하게 만들기 위해
- 주로 체크예외를 런타임 예외로 바꾸는 경우에 사용
4.1.4 예외처리 전략
-
런타임 예외의 보편화
- 자바 엔터프라이즈 환경에서는 수많은 요청이 들어옴 → 서버를 중단시키고 예외상황 복구가 불가능
- 애플리케이션 차원에서 예외상황을 미리 파악 후 통보
- 대응이 불가능한 체크예외라면 런타임 예외로 전환해서 던지는게 낫다
-
애플리케이션 예외
- 시스템 또는 외부의 예외상황이 원인이 아니라 애플리케이션 자체의 로직에 의해 의도적으로 발생시키고, 반드시 catch해서 조치를 취하도록 요구하는 예외
- ex) 출금 메소드에서 정상처리/잔고부족 리턴값을 다르게함 or 예외상황에서는 비즈니스적인 의미를 띤 예외를 던지도록 만드는 것
- 체크예외 사용
4.1.5 SQLException
- 코드레벨에서는 복구 불가능
- 관리자나 개발자한테 빨리 통보 ㄱㄱ
- 런타임 예외로 전환해줘야 함
4.2 예외 전환
예외 전환의 목적
- 굳이 필요하지 않은 catch/throws를 줄임
- 로우레벨의 예외를 더 의미있고 추상화된 예외로 바꿔서 던짐
4.2.1 JDBC 한계
- 비표준 SQL
- 호환성 없는 SQLExcepton DB 에러정보
4.2.2. DB 에러코드 매핑을 통한 전환
DB별 에러 코드를 참고해 발생한 예외의 원인이 무엇인지 해석해주는 기능 생성
4.2.3 DAO 인터페이스와 DataAccessExcepton 계층 구조
DataAccessException : 의미가 같은 예외라면 일관된 예외가 발생하도록 만들어줌
DAO 인터페이스와 구현의 분리
DAO를 따로 만드는 이유
- 데이터 액세스 로직을 담은 코드를 성격이 다른 코드에서 분리해놓기 위해
- 전략 패턴을 적용하기 위해
DAO에서 사용하는 데이터 액세스 기술의 API에서 예외 발생 → throws Exception; → 데이터 액세스 기술이 달라지면 다른 종류의 예외 발생 → 결국 DAO 사용 기술에 따라 예외처리 방법이 달라져야 함
데이터 액세스 예외 추상화와 DataAccessException 계층구조
그래서 스프링은 데이터 액세스마다 발생하는 예외들을 추상화해서 계층구조에 정리해놓음 데이터 액세스 지원 기술을 이용해 DAO를 만들면 기술에 독립적인 예외를 던질 수 있음
DAO를 데이터 액세스 기술에서 독립시키려면 인터페이스 도입과 런타임 예외 전환, 기술에 독립적인 추상화된 예외로 전환이 필요함
이일민, [토비의 스프링 3.1], 에이콘 출판사(2012)
