모든 예외는 적절하게 복구되던지 작업을 중단시키고 운영자/개발자에게 통보되어야 한다

예외처리의 안좋은 예 2가지

  1. 예외 무시
    • 예외처리 코드에서 아무 동작 X / 예외 출력만 함
  2. 무분별한 throws Exception

4.2.1 예외의 종류와 특징

  • Error
    • java.lang.Error 서브클래스
    • 시스템에 비정상적인 상황이 발생했을 때 사용
    • 대응방법 없으니 신경 ㄴㄴ
  • Exception과 체크 예외
    • 개발자들이 만든 애플리케이션 코드의 작업 중 예외상황이 발생했을 경우
    • catch문으로 잡는다 or throws를 정의해서 던진다 안하면 컴파일에러
  • RuntimeException과 언체크/런타임 예외
    • 프로그램의 오류가 있을 때 발생하도록 의도된 것들
    • NullPointException, IllegalArgumentException , …

체크예외 / 언체크 예외

체크 예외 : Exception 클래스의 서브클래스 + RuntimeException 클래스 상속 X

언체크 예외 : RuntimeExceptoin을 상속한 클래스

4.1.3 예외처리 방법

  1. 예외 복구
    • 예외 상황을 파악하고 문제를 해결해서 정상상태로 돌려놓는 것
    • 예외상황이 발생할 수 있음을 인식하도록 도와주고 이에 대한 처리를 시도하도록 요구
  2. 예외처리 회피
    • 예외처리를 자신이 담당하지 않고 호출한쪽으로 던지는 것
    • throws문 or catch문으로 예외 잡고 다시 rethrows
    • 그냥 던지는건 무책임한 책임 회피, 회피할땐 의도가 분명해야 함
  3. 예외 전환
    • 예외를 복구해서 정상적인 상태로 만들 수 없으니 메소드 밖으로 던지는 것
    • 발생한 예외를 그대로 넘기는게 아니라 적절한 예외로 전환해서 던짐
    • 중첩예외 이용
    • 의미를 분명하게 하고, 예외를 처리하기 쉽고 단순하게 만들기 위해
    • 주로 체크예외를 런타임 예외로 바꾸는 경우에 사용

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)