[토비의 스프링] Week5(4.1~4.3)

4 분 소요

토비의 스프링 3.1 Chapter 4.1~4.3

Chapater 4.1 사라진 SQLException

예외를 처리할 때 반드시 지켜야 할 핵심 원칙

모든 예외는 적절하게 복구되거나,
작업을 중단시키고 운영자 또는 개발자에게 분명하게 통보돼야 한다.

=> 굳이 예외를 잡아서 조치를 취할 방법이 없다면, throws로 다른 메서드에게 책임을 넘겨버리자.

=> 그렇다고 throws Exception으로 무의미한 예외를 전가하지 말자. 적절한 처리를 할 수 없게 만든다.

예외의 종류와 특징

Error (java.lang.Error)

  • 시스템에 비정상적인 상황이 발생했을 경우에 사용됨. (JVM이 발생시킴)

Exception

: 애플리케이션 코드의 작업 중에 예외상황이 발생했을 경우 사용됨.

Checked Exception

: 명시적인 처리가 필요한 예외

  • RuntimeException 클래스를 상속하지 않음.
  • 반드시 예외를 처리하는 코드를 함께 작성하거나, throws를 정의해서 메서드 밖으로 던져야 함.

Non-Checked Exception

: 명시적인 처리를 강제하지 않은 예외.

  • RuntimeException 클래스의 서브클래스.
  • 프로그램의 오류가 있을 때 발생함(프로그래머의 부주의)

예외처리 방법

1. 예외 복구

: 예외상황을 파악하고 문제를 해결해서 정상 상태로 돌려놓는 것. ex. 재시도를 통해 예외 복구(사전에 미리 성공 여부를 확인할 수 없는 경우)

2. 예외처리 회피

: 예외처리를 자신이 담당하지 않고 자신을 호출한 쪽으로 던져버리는 것. => thorws문 선언 / catch문으로 예외를 잡은 후 로그를 남기고 throw (rethrow)

3. 예외 전환

: 예외를 메서드 밖으로 던지되, 적절한 예외로 전환한 후 던진다. (중첩 예외)

목적

  • 예외의 의미를 분명하게 해 줄 필요가 있을 때
    (ex. API가 발생하는 기술적인 low level exception을 변경)
  • 예외를 처리하기 쉽고 단순하게 만들기 위해 포장(wrap) => 굳이 필요하지 않은 catch/throws를 줄인다. (ex. 예외처리를 강제하는 checked exception을 runtime exception으로 바꿀 때)

예외 처리 전략

런타임 예외의 보편화

=> 항상 복구할 수 있는 예외가 아니라면 일단 unchecked exception으로 만드는 경향이 있음.

add() 메서드의 예외처리

=> 복구 불가능한 예외는 그냥 런타임 예외로 포장해서 던진다. => 복구 가능한 예외는 명시적으로 throws하는 예외가 무엇인지 선언해야 한다. => 런타임 예외를 사용하는 경우에는 API문서를 통해 메서드를 사용할 때 발생할 수 있는 예외의 종류와 원인 ,활용 방법을 자세히 설명해 두어야 한다.

애플리케이션 예외

: 애플리케이션 자체의 로직에 의해 의도적으로 발생시키는 예외

설계 방법

  • 리턴 값을 일종의 결과 상태를 나타내는 정보로 활용하는 방법 => 리턴 값을 명확하게 코드화해놓을 필요가 잇음
  • 예외 상황에 비즈니스적인 의미를 띤 예외를 던지도록 만드는 방법 => 예외 처리를 catch 블록에 모아둘 수 있어서 편리함. => 이때 사용하는 예외는 checked exception이다.

4.2 예외 전환

JDBC의 한계

  • 자바를 이용해 DB에 접근하는 방법을 추상화된 api 형태로 정의해놓고, 각 db업체가 jdbc 표준을 따라 만들어진 드라이버를 제공하게 해준다.
  • SQL은 대부분 표준화되어 있지만 특정 DB 전용 문법이 사용되어 DAO 코드가 특정 DB에 종속된다.
  • 에러 코드가 공통화되어 있지 않고 DB마다 달라 DB에 독립적인 유연한 코드를 작성하기 힘들다.

=> DB 에러 코드 매핑으로 예외를 전환할 수 있다. => Spring은 DataAccessException이라는 runtime exception을 제공해 jdbc의 SQLException보다 폭넓은 범위의 예외를 분류할 수 있게 한다.

DataAccessException

  • RuntimeException으로 SQLException을 포장해 주는 역할
  • 상세한 예외 정보를 일관성 있는 예외로 전환해서 추상화
  • Jdbc의 SQLException을 전환하는 역할을 한다.
  • JPA, JDO, ibatis 등 의미가 같은 예외라면 데이터 액세스 기술의 종류와 상관없이 일관된 예외가 발생하도록 만들어준다. => 발생하는 예외들을 추상화해서 DataAccessException 계층 안에 정리해놓음.

=> 주의사항: 사용하는 기술의 종류와 상관없이 동일한 예외를 얻고 싶다면 직접 예외를 정의해두고, 좀 더 상세한 예외 전환을 해줄 필요가 있음.

댓글남기기