HibernateExceptionToDataAccessExceptionApsect 구상 중
어제랑 오늘은 회사 이사를 하느라고 공부를 제대로 못하겠네요. 아 삭신이.. 쑤시네요. ㅠ.ㅠ 살이 조금이라도 빠지기를 바라며.. 각설하고 본론으로 들어갑니다.
스프링에서 Hibernate를 사용해서 DAO를 구현하는 방법은 세 가지가 있습니다. 각각은 다음과 같은 특징이 있습니다.
HibernateTemplate
- JDBC Template과 비슷한 방식이다. 기존 스프링 사용자들에게 가장 익숙한 방법.
- Session에 직접 접근할 필요가 있을 때는 콜백 메소드를 사용해야 한다.
- 스프링 클래스를 사용해야만 한다.
- HibernateDaoSupport를 사용하면 SessionFactory의 세터를 만들 필요가 없다.
- unchecked exception만 던지도록 강제된다. 그리 나쁘진 않은 것 같은데..
- 12.2.3. The HibernateTemplate (2)
Spring 기반 DAO
- 콜백을 사용하지 않고도 Session에 직접 접근할 수 있다.
- HibernateDaoSuppoer의 getSession(Boolean)을 사용한다.
- unchecked exception은 물론이고 checked exception도 던질 수 있다.
- convertHibernateAccessException()를 사용해서 하이버네이트의 예외를 스프링의 DAE 형태로 바꿀 수 있다. 하지만 try-catch를 해서 다시 던져야 한다.
- 여전히 스프링 코드를 사용해야한다.
- 12.2.4. Implementing Spring-based DAOs without callbacks
Hibernate 3 API
- 하이버 3이 "contextual Sessions"이라는 개념으로 하이버 자체에서 트랜잭션 당 Session 하나를 관리한다.
- 스프링 코드를 하나도 사용하지 않는다.
- 예외는 하이버의 unchecked exception이다. 따라서 호출하는 쪽에서 완전히 일반적인 예외만 잡거나 하이버네이트에 국한된 예외를 잡아야 한다.
- 12.2.5. Implementing DAOs based on plain Hibernate3 API (2)
- 엊그제 저녁 토비형이 언급한 부분
Fortunately, Spring's LocalSessionFactoryBean supports Hibernate's
SessionFactory.getCurrentSession() method for any Spring transaction
strategy, returning the current Spring-managed transactional Session
even with HibernateTransactionManager. Of course, the standard behavior
of that method remains: returning the current Session associated with
the ongoing JTA transaction, if any (no matter whether driven by
Spring's JtaTransactionManager, by EJB CMT, or by JTA).
어쨋거나. 세 번째 경우의 DAO의 코드가 가장 심플한데 딱 하나의 단점(?)을 가지고 있습니다. 바로 예외와 관련된 부분인데, 하이버 3.0 부터 Unchecked Exception으로 바꾸긴 했지만, 스프링의 Data Access Exception을 꼭 사용하고 싶을 수도 있겠습니다.
예외 처리가 필요 없거나, 하이버네이트를 매우 많이 사용하는 애플리케이션이라면 그냥 사용하면 되겠지만, 스프링의 DAE를 사용하여 OptimisticLockingFailureException 이런 에러를 잡아 내고 싶다면, 이런 제약 사항이 별로 달갑지 않을 것입니다.
그래서.. 생각 해본 게 바로 HibernateException을 DataAccessException으로 바꿔주는 Aspect입니다. HibernateException이 발생하면, 해당 예외를 잡아서 DataAccessException으로 바꿔서 다시 던지는 역할을 하는 Aspect를 만들고 싶습니다. 재미로..
Apsect 구현은 간단하게 Spring의 @Aspect 를 사용하는 방법과 AspectJ를 사용하여 구현한 다음 Spring과 연동하는 방법이 있는데 전자를 먼저 해보고, 잘 되면 후자를 해보겠습니다.
ps: 설마 이미 누가 만들어 두진 않았겠죠. 간단한거라.. 그랬을 수도 있겠지만 재미삼아 ㄱㄱㅆ