반응형
1. JPA 표준 예외
- JPA 예외는 모두 언체크 예외다.
- JPA 표준 예외는 예외의 심각 정도에 따라 롤백이 필수가 될 수도 있고 선택이 될 수도 있다.
1) 반드시 롤백해야 하는 예외
- 트랜잭션을 강제로 커밋해도 javax.persistence.RollbackException 예외가 발생한다.
- javax.persistence.EntityExistsException : EntityManager.persist() 호출 시 이미 같은 엔티티가 존재할 경우
- javax.persistence.EntityNotFoundException : 엔티티가 존재하지 않는 경우
- javax.persistence.OptimisticLockException : 낙관적 락 충돌 시
- javax.persistence.PessimisticLockException : 비관적 락 충돌 시
- javax.persistence.RollbackException : 반드시 롤백 해야 하는 트랜잭션을 강제로 커밋했거나 커밋에 실패 했을 경우
- javax.persistence.TransactionRequiredException : 트랜잭션이 필요할 때 트랜잭션이 없을 경우
2) 롤백하지 않아도 되는 예외
- 심각한 예외는 아니기 때문에 개발자가 롤백 여부를 판단할 수 있다.
- javax.persistence.NoResultException : Query.getSingleResult() 호출 시 결과가 하나도 없을 경우
- javax.persistence.NonUniqueResultException : Query.getSingleResult() 호출 시 결과가 둘 이상일 경우
- javax.persistence.LockTimeoutException : 비관적 락에서 시간 초과 시
- javax.persistence.QueryTimeoutException : 쿼리 실행 시간 초과 시
2. JPA 예외를 Spring 예외로 변환
- Spring은 JPA와 같은 데이터 접근 계층의 구현 기술에 의존하지 않도록 추상화된 예외를 제공한다.
- JPA 예외를 Spring이 제공하는 추상화된 예외로 변경하기 위해서는 org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor를 bean으로 등록하면 된다.
xml 방식
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />
어노테이션 방식
@Bean
public PersistenceExceptionTranslationPostProcessor persistenceExceptionTranslation() {
return new PersistenceExceptionTranslationPostProcessor();
}
- JPA 예외가 어떤 Spring 예외로 변환되는지 알아보자.
- javax.persistence.PersistenceException -> org.springframework.orm.jpa.JpaSystemException
- javax.persistence.EntityExistsException -> org.springframework.dao.DataIntegrityViolationException
- javax.persistence.EntityNotFoundException -> org.springframework.orm.jpa.JpaObjectRetrievalFailureException
- javax.persistence.OptimisticLockException -> org.springframework.orm.jpa.JpaOptimisticLockingFailureException
- javax.persistence.PessimisticLockException -> org.springframework.orm.jpa.JpaPessimisticLockingFailureException
- javax.persistence.RollbackException -> org.springframework.transaction.TransactionSystemException
- javax.persistence.TransactionRequiredException -> org.springframework.dao.InvaildDataAccessApiUsageException
- javax.persistence.NoResultException -> org.springframework.dao.EmptyResultDataAccessException
- javax.persistence.NonUniqueResultException -> org.springframework.dao.IncorrectResultSizeDataAccessException
- javax.persistence.LockTimeoutException -> org.springframework.dao.CannotAcquireLockException
- javax.persistence.QueryTimeoutException -> org.springframework.dao.QueryTimeoutException
- JPA 표준 명세상 발생할 수 있는 예외도 다음과 같이 Spring 예외로 변환할 수 있다.
- java.lang.IllegalStateException -> org.springframework.dao.InvaildDataAccessApiUsageException
- java.lang.IllegalArgumentException -> org.springframework.dao.InvaildDataAccessApiUsageException
- 예외를 변환하지 않고 직접 반환할 예외를 지정하고 싶다면 throws를 이용하자.
3. JPA에서 예외 처리 시 주의할 점
- 트랜잭션을 롤백하면 DB의 반영사항은 복구되지만 엔티티는 복구되지 않는다. 트랜잭션이 롤백되었을 때 새로운 영속성 컨텍스트를 사용하거나 EntityManager.clear() 메소드를 호출해서 영속성 컨텍스트를 초기화하는 것이 좋다.
● 참고자료 : 자바 ORM 표준 JPA 프로그래밍
반응형
'Spring 사전 준비 > JPA Hibernate' 카테고리의 다른 글
[JPA] 트랜잭션과 Lock (0) | 2022.08.29 |
---|---|
[JPA] 성능 최적화 (0) | 2022.08.27 |
[JPA] 엔티티 그래프 (0) | 2022.08.25 |
[JPA] JPA 리스너 (0) | 2022.08.24 |
[JPA] Entity와 Table간의 데이터 타입 변환 (0) | 2022.08.24 |
댓글