Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 읽기쉬운코드
- 스프링
- 백준
- framework
- 데이터베이스
- 엘라스틱서치
- 알고리즘
- 애자일기법
- Baekjoon
- 개발자
- ES
- Spring
- 애자일프로그래밍
- Java
- JPA
- 코딩테스트
- 코드
- API
- cleancode
- database
- 자바
- 그리디
- 개발
- 코딩
- spring boot
- Elasticsearch
- 클린코드
- 프레임워크
- 애자일
- 그리디알고리즘
Archives
- Today
- Total
튼튼발자 개발 성장기🏋️
JPA 표준 예외와 트랜잭션 롤백 본문
반응형
JPA에서는 예외가 발생했을 때 표준 예외를 던지며, JPA 예외는 런타임 예외인 PersistenceException을 상속받는다. JPA 예외는 크게 두 가지 범주로 나눌 수 있다.
- 트랜잭션 롤백을 표시하는 예외: 트랜잭션 롤백이 필요함을 나타내는 예외다. 이 예외가 발생하면 트랜잭션이 강제로 롤백된다.
- 트랜잭션 롤백을 표시하지 않는 예외: 트랜잭션 롤백을 강제하지 않으며, 트랜잭션을 계속 유지할 수 있는 예외다.
트랜잭션 롤백을 표시하는 예외
이 범주에 속하는 예외는 비정상적인 데이터 액세스나 영속성 컨텍스트의 무결성 문제를 발생시킬 때 던진다. 트랜잭션을 즉시 롤백해야 함을 나타내며, 이를 복구하려고 시도할 수 없다.
- EntityExistsException: 이미 존재하는 엔티티를 병합하거나 영속하려고 할 때 발생한다.
- EntityNotFoundException: 영속성 컨텍스트에서 찾으려는 엔티티가 존재하지 않을 때 발생한다. 주로 getReference()로 엔티티를 조회했을 때 발생한다.
- OptimisticLockException: 낙관적 락을 사용할 때, 두 개 이상의 트랜잭션이 동시에 엔티티를 수정하려고 하면 발생한다.
- PessimisticLockException: 비관적 락을 시도할 때 락을 획득하지 못하면 발생한다.
- RollbackException: 트랜잭션이 롤백된 후에도 커밋을 시도하면 발생한다.
- ConstraintViolationException: 데이터베이스 제약 조건 위반이 발생할 때 발생한다.
- TransactionRequiredException: 트랜잭션이 필요한 작업을 트랜잭션 없이 수행하려고 할 때 발생한다.
트랜잭션 롤백을 표시하지 않는 예외
이 범주에 속하는 예외는 트랜잭션 롤백을 강제하지 않는다. 일반적으로 트랜잭션을 계속 유지할 수 있으며, 발생한 예외를 처리하거나 복구할 수 있다.
- NoResultException: 쿼리가 실행되었으나 결과가 없을 때 발생한다.
- NonUniqueResultException: 하나의 결과를 기대하는 쿼리가 둘 이상의 결과를 반환할 때 발생한다.
- LockTimeoutException: 비관적 락을 획득하려고 했으나 시간이 초과되면 발생한다.
- QueryTimeoutException: 쿼리 실행 시간이 초과되었을 때 발생한다.
- IllegalArgumentException: JPA 메소드에 잘못된 매개변수가 전달되었을 때 발생한다.
- PersistenceException: JPA에서 발생하는 대부분의 예외의 상위 예외다. 데이터베이스 관련 예외나 영속성 관련 예외가 발생했을 때 주로 발생한다.
트랜잭션 롤백 시 주의사항
트랜잭션 롤백은 데이터베이스 작업에서 문제가 발생했을 때 모든 변경 사항을 원래 상태로 되돌리는 과정이다. 트랜잭션 롤백을 제대로 수행하지 않으면 데이터 일관성 문제나 데이터 손실이 발생할 수 있으므로, 롤백 시 주의사항을 잘 이해하고 적절히 처리하는 것이 중요하다.
- 예외 처리 및 롤백
- 체계적인 예외 처리: 롤백을 적절히 처리하기 위해 예외가 발생할 수 있는 코드에 대해 체계적으로 예외를 처리해야한다. 예외가 발생했을 때 롤백을 명시적으로 호출하거나 트랜잭션 관리자가 자동으로 롤백하도록 해야한다.
- 트랜잭션 경계 정의: 트랜잭션 경계를 명확히 설정하고, 예외 발생 시 트랜잭션이 자동으로 롤백되도록 하는 것이 중요하다.
- 트랜잭션 전파 (Propagation)
- 전파 속성: 트랜잭션의 전파 속성(예: REQUIRED, REQUIRES_NEW)을 이해하고 적절하게 설정한다. 예를 들어, 내부 트랜잭션에서 예외가 발생하면 외부 트랜잭션도 롤백되도록 할 수 있다.
- 전파 전략 주의: 잘못된 전파 전략을 설정하면 의도하지 않은 롤백이나 커밋이 발생할 수 있다.
- 다중 트랜잭션 처리
- 중첩 트랜잭션: 중첩 트랜잭션 처리 시, 자식 트랜잭션이 실패하면 부모 트랜잭션도 롤백되어야 한다. 이를 통해 데이터 무결성을 유지할 수 있다.
- 트랜잭션 관리: 다중 트랜잭션 환경에서는 트랜잭션 관리를 철저히 하고, 트랜잭션 간의 의존성 및 상태를 잘 이해해야한다.
- 트랜잭션 롤백 후 상태 관리
- 리소스 정리: 트랜잭션 롤백 후 열린 리소스(파일, 네트워크 연결 등)를 적절히 정리해야 한다. 롤백 과정에서 자원이 누수되지 않도록 주의해야 한다.
- 상태 일관성: 롤백 후 애플리케이션의 상태가 일관성을 유지하도록 관리한다. 롤백이 완료된 후에도 상태를 검증하고 필요한 경우 추가 작업을 수행한다.
- 트랜잭션 격리 수준
- 격리 수준 이해: 데이터베이스의 트랜잭션 격리 수준(READ_COMMITTED, SERIALIZABLE)을 이해하고 적절히 설정한다. 잘못된 격리 수준 설정은 데이터 무결성 문제를 일으킬 수 있다.
- 충돌 방지: 격리 수준에 따라 데이터 충돌을 방지하고, 트랜잭션 간의 상호작용을 관리한다.
- 트랜잭션 롤백과 캐시
- 영속성 컨텍스트 캐시: JPA에서는 영속성 컨텍스트가 엔티티를 캐시한다. 트랜잭션 롤백 시 캐시된 엔티티가 잘못된 상태로 남아있을 수 있으므로, 트랜잭션 롤백 후 영속성 컨텍스트를 초기화하거나 상태를 검증해야 한다.
- 캐시 일관성 유지: 롤백 후 캐시와 데이터베이스의 일관성을 유지하도록 주의해야 한다.
- 트랜잭션 롤백 시 로그 기록
- 적절한 로깅: 트랜잭션 롤백 시 어떤 이유로 롤백이 발생했는지 적절히 로깅하고 분석할 수 있도록한다. 이를 통해 문제 발생 시 원인을 파악하고 조치할 수 있다.
- 트랜잭션 롤백과 비즈니스 로직
- 비즈니스 로직 검토: 롤백 시 비즈니스 로직이 의도한 대로 동작하는지 검토한다. 롤백이 비즈니스 규칙이나 데이터 상태에 미치는 영향을 고려해야 한다.
반응형
'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 |