ek120000000003.java
테스트 코드를 작성하고, 만들기 시작했습니다.

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class MemberDaoTest {
   
    @Autowired
    private MemberDao memberDao;
   
    @Test(expected=DataAccessException.class)
    public void hibernateExceptoin() throws Exception {
        assertNotNull(memberDao);
       
        memberDao.crazy();
    }
   
}

XML 설정 파일에는 별 거 없습니다.

    <bean class="whiteship.dao.support.HibernateExceptionToDataAccessExceptionAspect" />
   
    <aop:aspectj-autoproxy/>

위에서 만든 Apsect를 bean으로 등록해주고, Auto Proxy를 사용하도록 설정했습니다.

crazy라는 메소드는 다음과 같이 구현되어있습니다.

    public void crazy() {
        sessionFactory.getCurrentSession().createQuery("Delete From IWantYou");
    }

IWantYou라는 테이블이 있을리 만무하기 때문에, 당연히 저런 테이블을 찾을 수 없다는 HibernateException이 발생할 것입니다. 그러나 그걸 HibernateExceptionToDataAccessExceptionAspect가 적용된 프록시가 가로채서 스프링의 DataAccessException으로 바꿔서 다시 던져줄 겁니다. 그래서 위에 있는 테스트는 통과하게 되어있죠.

사용자 삽입 이미지

처음에는 @Around를 사용해서 구현했는데, 그럴 필요가 없더군요. @AfterThrowing만 사용해도 충분히 제 역할을 할 수 있길래, 바꿨습니다. 소스 코드는 대략.10줄.

@Aspect
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;
    }
}

ek120000000003.java