대표적인 잘못된 예외처리

  • 예외 블랙홀
    • try-catch 구문으로 감싼 코드 중, 예외에 대한 어떤 처리도 하지 않는 코드를 지칭
    • 모든 예외는 적절하게 복구되거나, 작업을 중단하고 운영자/개발자에게 통보되어야 함
  • 무의미하고 무책임한 throws
    • 특별한 사유 없이 throws Exception을 붙여 예외를 넘겨버리는 코드
    • 이렇게 처리한 메소드를 사용하는 메소드에서는 Exception에 대해 try-catch하거나, throws Exception으로 넘겨버릴 수 밖에 없음


예외의 종류와 특징
  • Error
    • java.lang.Error 클래스의 서브 클래스
    • VM에서 발생시키고, 애플리케이션에서 해결할 수 없는 에러이므로, 특별한 상황 외에 처리할 필요 없음
    • e.g. OutOfMemoryError, ThreadDeath
  • 체크 예외 (Checked Exception)
    • java.lang.Exception 클래스를 상속한 예외 중 RuntimeException을 제외한 예외
    • 명시적으로 try-catch로 처리하거나, throws로 던지지 않으면 컴파일 에러가 발생
    • e.g. IOException, SQLException
  • RuntimeException/언체크 예외 (Unchecked Exception)
    • java.lang.RuntimeException을 상속한 예외
    • 필요시 개발자가 직접 try-catch나 throws를 통해 처리할 수 있음
    • e.g. NullPointerException, IllegalArgumentException

예외 처리 방법
  • 예외 복구
    • 예외 상황을 파악하고, 문제를 해결하여 정상 상태로 돌려놓는 것
  • 예외 처리 회피
    • 예외 처리를 호출한 쪽으로 던지는 것 (throws/rethrow)
    • 반드시 분명한 의도를 가지고 회피를 해야 함
  • 예외 전환 (Exception Translation)
    • 예외를 다른 예외로 전환하여 throw
    • 두 가지 목적으로 사용 가능
      • 예외의 의미를 명확히 하기 위해 (e.g. SQLException --> DuplicateUserIdException)
      • 예외를 처리하기 쉽게 하기 위해 (e.g. 체크예외-->언체크예외)


스프링의 예외 처리

  • SQLException은 대부분 복구 불가능한 예외
  • 스프링의 JdbcTemplete은 런타임 예외인 DataAccessException으로 SQLException을 포장해서 던져줌
  • 또한, DataAccessException은 다양한 DB에 대한 세분화된 예외를 제공
    • e.g. InvalidResultSetAccessException, DuplicateKeyException, DataIntegrityViolationException, ... 
  • 예외 정보를 좀 더 구체화하여 데이터 로직과 다른 로직을 분리하기 용이하게 하고, 다양한 데이터 접근 기술(e.g. JPA, Hibernate, JDO 등)을 사용하기 용이
  • 단, 모든 기술에 대해 세분화된 예외가 전부 구현된 것은 아니므로, 어느정도 추상화된 공통 예외를 사용해야 함 (e.g. DuplicateKeyException은 JDBC에 대해서만 발생, 하이버네이트의 경우 DataIntegrityViolation으로 발생)


+ Recent posts