try {
// ...
} catch(SQLException e) {
}
throws
throws
를 전파하게 된다.throws
를 보게 되면 왜 발생하는 예외인지 조차 파악하기 힘들 수 있다.Error
OutOfMemoryError
, ThreadDeath
Exception
과 체크 예외
catch
로 잡아내든가, throws
를 정의해 밖으로 던져야 한다.RuntimeException
이나 적절한 추상화 레벨의 예외로 전환해서 던질 것RuntimeException
catch
/throws
없이 컴파일 된다.DataSource
를 사용한다.
EntityManager
가 DataSource
를 사용해서 엔티티를 쿼리로 만들게 된다.
EntityManagerFactory
가 EntityManager
를 매 트랜잭션마다 생성하게 된다.JpaRepository
를 거쳐서 사용하게 된다.SQLException
을 래핑해서 JPA 표준 예외로 던진다.Order
를 저장할 때 주문번호가 중복으로 들어가면 어떤 복구 작업을 해야한다고 해보자.try {
Order order = new Order("100", BigDecimal.ONE);
repository.save(order)
} catch(ConstraintViolationException e) {
// 주문번호 충돌을 복구하는 작업
}
ConstraintViolationException
은 JPA 구현체인 하이버네이트에서 발생시키는 예외다.
SQLException
, JPA의 예외 등을 번역해서 래핑된 형태로 전달한다.DataAccessException
ConstraintViolationException
의 경우도 스프링은 org.springframework.dao.DataIntegrityViolationException
으로 던지게 된다.체계적인 예외 구조를 만들고 적절한 예외 처리 방법을 사용하고 있는지 살펴보자