Search

낙서장5

주제
개념
방법
결론
우리는 왜 예외 처리를 잘해야 할까?
토비의 스프링 주제
전반적인 느낌은 예외를 어떻게 추상화하고 있는가? 이런 내용
그럼 일반적으로 발생할 수 있는 예외들을 왜 통일화 해줘야하는 것일까?
종속적이면 변경이 힘들어지기 때문에
그럼 이걸 어떻게 해결하고 있는가?
포장해서 dataAccessException으로 만들어 주고 있다. 정확히는 매핑시켜주는것이다.
이덕분에 1) 데이터 엑세스로직을 담은 코드를 성격이 다른 코드랑 분리가능, 2)분리된 DAO는 전략패턴을 적용해 구현방법을 변경해서 사용가능
코드상에서 성격 즉, 구현이나 기술에 의존적이거나 처리하는 기능이 다른 녀석들을 분리하거나 없어지게 하는 것
정확하게는 인터페이스부분에 throw 구문이 사라질 수 있다. 체크예외의 경우 명시를 해줘야하지만 적정한 언체크예외로 전환해주는 덕분에 인터페이스 부분에서 throw를 제거할 수 있고 이 덕분에 다른 퍼시스턴트 기술을 사용할때도 동일한 인터페이스를 적용할 수 있게 된다.
하지만 예외는 디비마다 달라서 일괄적으로 처리하기 빡세다.
JDBC : SQLException
JPA : PersistenceException
Hibernate : HibernateException
랩핑을 하기 전에는 이러한 코드들이었다. 그럼 결국 코드상으로는 의존성을 제거했으나, 기술에는 의존적인 이상한 상황이 발생한다.
하지만 요즘 나온 최신 기술들은 체크 예외가 아닌 런타임예외를 사용한다. 남은 SQLException의 경우에는 런타임예외로 wrapping 하여 던지면 된다.
더잘처리하기 위한 노력은
그러나 중복아이디예외와 같은 의미 있는 예외도 있다. 즉, 비즈니스로직에서 필요한 예외를 말한다. 이러한 예외는 분류하고 의미있게 처리할 필요가 있다. 하지만 각 엑세스 기술마다 던지는 예외가 다르기 때문에 DAO를 사용하는 클라이언트에서 예외처리방법이 달라져야한다. 결국 클라이언트 단에서 처리하는 방식을 변경한다는 건 기술에 의존적이라는 것이다.
결론적으로 클라이언트 단에서 정의를 다시한번 해줘야한다.
그래서 스프링은 DataAccessException을 포장하되 정말 세분화해서 만들었다.
코드상에서는 throws 가 아예 없어졌지만 그리고 테스트해보면 DuplicateKeyException 이 정확히 발생한다.
하지만 JDBC 에서는 이 예외가 정확하게 세분화되어 나오지만 여타 다른 퍼시스턴트 엑세스 기술 (JPA 등)에서는 동일한 예외가 아닌 DataAccessException으로 나온다. 이러한 경우 JDBC의 도움을 받아 예외를 뽑아내야한다.
결국 예외를 적절하게 전환해준다는 건 의존성을 애플리케이션에서 제거 시킬 수 있다는 것과 같은 말이라고 생각된다.
이러한 작업을 하는 건 기술의 발전 및 요구사항의 증가로 더욱 편하게 개발을 하고 요구사항을 충족하기 위한 과정이라고 생각된다.
정리
예외를 잡아서 아무런 행위를 취하지 않거나 의미 없는 throws 선언을 남발하는 건 위험하다
예외는 복구하거나 예외처리를 오브젝트로 의도적으로 전달하거나 적절한 예외로 전환해야한다
좀 더 의미있는 예외로 변경하거나, 불필요한 catch/throws를 피하기 위해 런타임 에외로 포장하는 두가지 방법의 예외전환이 있다
복구할 수 없는 예외는 가능한 한 빨리 런타임 예외로 전환하는 것이 바람직하다
애플리케이션의 로직을 담기 위한 예외는 체크 예외로 만든다
JDBC의 SQLException은 대부분 복구할 수 없는 예외이므로 런타임 예외로 포장해야한다
SQLException의 에러 코드는 DB에 종속되기 때문에 DB에 독립적인 예외로 전환될 필요가 있다
스프링 DataAccesssException을 통해 DB에 독립적으로 적용 가능한 추상화된 런타임 예외 계층을 제공한다
DAO를 데이터 액세스 기술에서 독립시키려면 인터페이스 도입과 런타임 예외 전환, 기술에 독립적인 추상화된 예외로 전환이 필요하다
그럼 내가 이번 주제에서 뭘 하면 좀 더 얻어 갈 수 있을까?
지금 생각나는 주제는
1.
효율적인 로깅 - 예외처리를 배웟는데 예외를 처리할때 부가적인 작업?
잘 남은 로그
2.
적절한 비즈니스 예외로의 전환 - 예외를 어떤 방식의 기준점을 잡고 전환할 것인가? 의미있는 예외란?
exception 처리?
3.
백기선님의 9주차 스터디
학습?
4.
로깅 전략?
로그전략이 뭐지?
5.
자바 예외 처리의 best Practice (Lokesh Gupta 개발자)
best