JVM/JPA

JPA 예외 처리

kyoulho 2023. 7. 3. 16:26

JPQ 표준 예외

javax.persistence.PersistenceException의 자식 클래스다. 그리고 이 예외 클래스는 RuntimeException의 자식이다.

트랜잭션 롤백을 표시하는 예외는 심각한 예외이므로 복구해선 안 된다. 이 예외가 발생하면 트랜잭션을 강제로 커밋해도 트랜잭션이 커밋되지 않고 대신에 javax.persistence.RollbackException 예외가 발생한다.

트랜잭션 롤백을 표시하지 않는 예외는 심각한 예외가 아니다. 따라서 개발자가 트랜잭션을 커밋할지 롤백할지를 판단하면 된다.

 

트랜잭션 롤백을 표시하는 예외

트랜잭션 롤백을 표시하는 예외 설명
EntityExistsException 저장 중에 이미 같은 엔티티가 있으면 발생
EntityNotFoundException 프로시 실제 사용 시 엔티티가 존재하지 않으면 발생
OptimisticLockException 낙관적 락 충돌시 발생
PessimisticLockException 비관적 락 충돌시 발생
RollbackException EntityTransaction.commit() 실패 시 발생
롤백이 표시되어 있는 트랜잭션 커밋 시에도 발생
TransactionRequiredException 트랜잭션이 필요할 때 트랜잭션이 없으면 발생
트랜잭션 없이 엔티티를 변경할 때 주로 발

 

트랜잭션 롤백을 표시하지 않는 예외

트랜잭션 롤백을 표시하지 않는 예외 설명
NoResultException Query.getSingleResult() 호출 시 결과가 하나도 없을 때 발생
NonUniqueResultException Query.getSingleResult() 호출 시 결과가 둘 이상일 대 발생
LocktimeoutException 비관적 락에서 시관 초과 시 발생
QueryTimeoutException 쿼리 실행 시간 초과 시 발생

 

스프링 프레임워크의 JPA 예외 변환

PersistenceExceptionTranslationPostProcessor를 스프링 빈으로 등록하면 JPA 예외를 스프링 프레임워크가 제공하는 추상화된 예외로 변경하여 준다.

이것은 @Repository 어노테이션을 사용한 곳에 예외 변환 AOP를 적용해서 작동한다.

JPA 예외 스프링 변환 예외
PersistenceException org.springframework.orm.jpa.JpaSystemException
NoResultException org.springframework.dao.EmptyResultDataAccessException
NonUniqueResultException org.springframework.dao.IncorrectResultSizeDataAccessException
LockTimeoutException org.springframework.dao.CannotAcquireLockException
QueryTimeoutException org.springframework.dao.QueryTimeoutException
EntityExistsException org.springframework.dao.DataIntegrityViolationException
EntityNotFoundException org.springframework.orm.jpa.JpaObjectRetrievalFailureException
OptimisticLockException org.springframework.orm.jpa.JpaOptimisticLockingFailureException
PessimisticLockException org.springframework.dao.PessimisticLockingFailureException
TransactionRequiredException org.springframework.dao.InvalidDataAccessApiUsageException
RollbackException org.springframework.transaction.Transaction.TransactionSystemException
java.lang.IllegalStateException org.springframework.dao.InvalidDataAccessApiUsageException
java.lang.IllegaArgumentExceptioin org.springframework.dao.InvalidDataAccessApiUsageException

 

트랜잭션 롤백 시 주의사항

트랜잭션을 롤백하는 것은 데이터베이스의 반영사항만 롤백하는 것이지 수정된 자바 객체까지 원상태로 복구해주지는 않는다. 스프링 프레임워크는 영속성 컨텍스트의 범위에 따라 다른 방법을 사용한다.

기본 전략인 트랜잭션당 영속성 컨텍스트 전략은 문제가 발생하면 트랜잭션 AOP 종료 시점에 트랜잭션을 롤백하면서 영속성 컨텍스트도 함께 종료하므로 문제가 발생하지 않는다.

또한 영속성 컨텍스트의 범위를 트랜잭션의 범위보다 넓게 설정하면 트랜잭션 롤백 시 영속성 컨텍스트를 초기화해서 잘못된 영속성 컨텍스트를 사용하는 문제를 예방한다.

 

 

728x90

'JVM > JPA' 카테고리의 다른 글

N+1 문제  (0) 2023.07.04
영속성 컨텍스트와 프록시  (0) 2023.07.03
엔티티 그래프  (0) 2023.07.03
리스너  (0) 2023.07.02
@Converter  (0) 2023.07.02