HibernateExceptionToDataAccessExceptionApsect
ek120000000003.java
테스트 코드를 작성하고, 만들기 시작했습니다.
@ContextConfiguration
public class MemberDaoTest {
@Autowired
private MemberDao memberDao;
@Test(expected=DataAccessException.class)
public void hibernateExceptoin() throws Exception {
assertNotNull(memberDao);
memberDao.crazy();
}
}
XML 설정 파일에는 별 거 없습니다.
<aop:aspectj-autoproxy/>
위에서 만든 Apsect를 bean으로 등록해주고, Auto Proxy를 사용하도록 설정했습니다.
crazy라는 메소드는 다음과 같이 구현되어있습니다.
sessionFactory.getCurrentSession().createQuery("Delete From IWantYou");
}
IWantYou라는 테이블이 있을리 만무하기 때문에, 당연히 저런 테이블을 찾을 수 없다는 HibernateException이 발생할 것입니다. 그러나 그걸 HibernateExceptionToDataAccessExceptionAspect가 적용된 프록시가 가로채서 스프링의 DataAccessException으로 바꿔서 다시 던져줄 겁니다. 그래서 위에 있는 테스트는 통과하게 되어있죠.
처음에는 @Around를 사용해서 구현했는데, 그럴 필요가 없더군요. @AfterThrowing만 사용해도 충분히 제 역할을 할 수 있길래, 바꿨습니다. 소스 코드는 대략.10줄.
public class HibernateExceptionToDataAccessExceptionAspect {
@Pointcut("execution(* *.*Dao.*(..))")
private void anyHibernateDao() {
}
@AfterThrowing(pointcut="anyHibernateDao()", throwing="e")
public void doTranslate(Throwable e) throws Throwable {
if (e instanceof HibernateException) {
throw SessionFactoryUtils.convertHibernateAccessException((HibernateException) e);
}
throw e;
}
}