튼튼발자 개발 성장기🏋️

JPA 표준 예외와 트랜잭션 롤백 본문

API/JPA

JPA 표준 예외와 트랜잭션 롤백

시뻘건 튼튼발자 2024. 9. 14. 12:21
반응형

JPA에서는 예외가 발생했을 때 표준 예외를 던지며, JPA 예외는 런타임 예외인 PersistenceException을 상속받는다. JPA 예외는 크게 두 가지 범주로 나눌 수 있다.

  1. 트랜잭션 롤백을 표시하는 예외: 트랜잭션 롤백이 필요함을 나타내는 예외다. 이 예외가 발생하면 트랜잭션이 강제로 롤백된다.
  2. 트랜잭션 롤백을 표시하지 않는 예외: 트랜잭션 롤백을 강제하지 않으며, 트랜잭션을 계속 유지할 수 있는 예외다.

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

이 범주에 속하는 예외는 비정상적인 데이터 액세스영속성 컨텍스트의 무결성 문제를 발생시킬 때 던진다. 트랜잭션을 즉시 롤백해야 함을 나타내며, 이를 복구하려고 시도할 수 없다.

  • EntityExistsException: 이미 존재하는 엔티티를 병합하거나 영속하려고 할 때 발생한다.
  • EntityNotFoundException: 영속성 컨텍스트에서 찾으려는 엔티티가 존재하지 않을 때 발생한다. 주로 getReference()로 엔티티를 조회했을 때 발생한다.
  • OptimisticLockException: 낙관적 락을 사용할 때, 두 개 이상의 트랜잭션이 동시에 엔티티를 수정하려고 하면 발생한다.
  • PessimisticLockException: 비관적 락을 시도할 때 락을 획득하지 못하면 발생한다.
  • RollbackException: 트랜잭션이 롤백된 후에도 커밋을 시도하면 발생한다.
  • ConstraintViolationException: 데이터베이스 제약 조건 위반이 발생할 때 발생한다.
  • TransactionRequiredException: 트랜잭션이 필요한 작업을 트랜잭션 없이 수행하려고 할 때 발생한다.

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

이 범주에 속하는 예외는 트랜잭션 롤백을 강제하지 않는다. 일반적으로 트랜잭션을 계속 유지할 수 있으며, 발생한 예외를 처리하거나 복구할 수 있다.

  • NoResultException: 쿼리가 실행되었으나 결과가 없을 때 발생한다.
  • NonUniqueResultException: 하나의 결과를 기대하는 쿼리가 둘 이상의 결과를 반환할 때 발생한다.
  • LockTimeoutException: 비관적 락을 획득하려고 했으나 시간이 초과되면 발생한다.
  • QueryTimeoutException: 쿼리 실행 시간이 초과되었을 때 발생한다.
  • IllegalArgumentException: JPA 메소드에 잘못된 매개변수가 전달되었을 때 발생한다.
  • PersistenceException: JPA에서 발생하는 대부분의 예외의 상위 예외다. 데이터베이스 관련 예외영속성 관련 예외가 발생했을 때 주로 발생한다.

트랜잭션 롤백 시 주의사항

트랜잭션 롤백은 데이터베이스 작업에서 문제가 발생했을 때 모든 변경 사항을 원래 상태로 되돌리는 과정이다. 트랜잭션 롤백을 제대로 수행하지 않으면 데이터 일관성 문제나 데이터 손실이 발생할 수 있으므로, 롤백 시 주의사항을 잘 이해하고 적절히 처리하는 것이 중요하다.

  1. 예외 처리 및 롤백
    • 체계적인 예외 처리: 롤백을 적절히 처리하기 위해 예외가 발생할 수 있는 코드에 대해 체계적으로 예외를 처리해야한다. 예외가 발생했을 때 롤백을 명시적으로 호출하거나 트랜잭션 관리자가 자동으로 롤백하도록 해야한다.
    • 트랜잭션 경계 정의: 트랜잭션 경계를 명확히 설정하고, 예외 발생 시 트랜잭션이 자동으로 롤백되도록 하는 것이 중요하다.
  2. 트랜잭션 전파 (Propagation)
    • 전파 속성: 트랜잭션의 전파 속성(예: REQUIRED, REQUIRES_NEW)을 이해하고 적절하게 설정한다. 예를 들어, 내부 트랜잭션에서 예외가 발생하면 외부 트랜잭션도 롤백되도록 할 수 있다.
    • 전파 전략 주의: 잘못된 전파 전략을 설정하면 의도하지 않은 롤백이나 커밋이 발생할 수 있다.
  3. 다중 트랜잭션 처리
    • 중첩 트랜잭션: 중첩 트랜잭션 처리 시, 자식 트랜잭션이 실패하면 부모 트랜잭션도 롤백되어야 한다. 이를 통해 데이터 무결성을 유지할 수 있다.
    • 트랜잭션 관리: 다중 트랜잭션 환경에서는 트랜잭션 관리를 철저히 하고, 트랜잭션 간의 의존성 및 상태를 잘 이해해야한다.
  4. 트랜잭션 롤백 후 상태 관리
    • 리소스 정리: 트랜잭션 롤백 후 열린 리소스(파일, 네트워크 연결 등)를 적절히 정리해야 한다. 롤백 과정에서 자원이 누수되지 않도록 주의해야 한다.
    • 상태 일관성: 롤백 후 애플리케이션의 상태가 일관성을 유지하도록 관리한다. 롤백이 완료된 후에도 상태를 검증하고 필요한 경우 추가 작업을 수행한다.
  5. 트랜잭션 격리 수준
    • 격리 수준 이해: 데이터베이스의 트랜잭션 격리 수준(READ_COMMITTED, SERIALIZABLE)을 이해하고 적절히 설정한다. 잘못된 격리 수준 설정은 데이터 무결성 문제를 일으킬 수 있다.
    • 충돌 방지: 격리 수준에 따라 데이터 충돌을 방지하고, 트랜잭션 간의 상호작용을 관리한다.
  6. 트랜잭션 롤백과 캐시
    • 영속성 컨텍스트 캐시: JPA에서는 영속성 컨텍스트가 엔티티를 캐시한다. 트랜잭션 롤백 시 캐시된 엔티티가 잘못된 상태로 남아있을 수 있으므로, 트랜잭션 롤백 후 영속성 컨텍스트를 초기화하거나 상태를 검증해야 한다.
    • 캐시 일관성 유지: 롤백 후 캐시와 데이터베이스의 일관성을 유지하도록 주의해야 한다.
  7. 트랜잭션 롤백 시 로그 기록
    • 적절한 로깅: 트랜잭션 롤백 시 어떤 이유로 롤백이 발생했는지 적절히 로깅하고 분석할 수 있도록한다. 이를 통해 문제 발생 시 원인을 파악하고 조치할 수 있다.
  8. 트랜잭션 롤백과 비즈니스 로직
    • 비즈니스 로직 검토: 롤백 시 비즈니스 로직이 의도한 대로 동작하는지 검토한다. 롤백이 비즈니스 규칙이나 데이터 상태에 미치는 영향을 고려해야 한다.
반응형

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

2차 캐시  (1) 2024.09.21
N+1 문제  (0) 2024.09.14
컬렉션과 부가 기능  (2) 2024.09.14
웹 애플리케이션과 영속성 관리  (0) 2024.09.08
스프링 데이터 JPA  (0) 2024.09.08