본문 바로가기
  • 실행력이 모든걸 결정한다
Spring 사전 준비/JPA Hibernate

[JPA] JPA 예외 처리

by 김코더 김주역 2022. 8. 25.
반응형

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

댓글