jpa고급쿼리최적화_트랜잭션이해
jpa고급쿼리최적화_트랜잭션이해
필기 가자
Spring의 @Transactional 어노테이션을 활용하여 트랜잭션 시작, 커밋, 롤백의 흐름을 구현하고, 실무에서 자주 발생하는 트랜잭션 관리 문제를 효과적으로 해결하는 방법을 배웁니다.
또한, JPA의 영속성 컨텍스트와 Dirty Checking(변경 감지)을 이해하고, Flush 시점을 제어하여 효율적인 데이터 변경 관리 방법을 학습합니다.
실습을 통해 E-commerce 주문 및 환불 프로세스를 구현하면서 트랜잭션 실패 시 롤백 처리와 데이터 일관성 보장의 중요성을 체득
트랜잭션
Spring AOP를 통해 메서드 호출 시 프록시가 트랜잭션 처리를 가로챕니다.
Flush와 더티 체킹
영속성 컨텍스트란?
- JPA에서 엔티티를 관리하기 위해 제공하는 1차 캐시 역할의 메모리 공간입니다.
- 데이터베이스와의 동기화를 효율적으로 관리하며, 데이터 변경 사항을 추적합니다.
Dirty Checking (변경 감지)란?
영속성 컨텍스트가 관리하는 엔티티가 변경되었는지 감지하여, 변경 사항을 트랜잭션 커밋 시점에 데이터베이스에 반영하는 JPA의 기본 메커니즘입니다.
- 동작 원리:
- 트랜잭션 시작 시, 영속성 컨텍스트는 엔티티의 현재 상태를 스냅샷으로 저장합니다.
- 트랜잭션 중간에 엔티티 필드가 변경되면, 스냅샷과 현재 상태를 비교하여 변경된 부분을 감지합니다.
- 트랜잭션 종료 시, 변경된 엔티티에 대한
UPDATE쿼리를 데이터베이스에 전송합니다.- 궁금증. 변경된 엔티티에 대한 update쿼리는 별도의 트랜잭션은 가지는지? 그게 실패하면?
Flush 시점
- Flush는 자동으로 호출되며, 일반적으로 다음 시점에 실행됩니다:
- 트랜잭션 커밋 시점: 트랜잭션 종료 전에 자동으로 Flush가 호출되어 변경 사항을 반영합니다.
- JPQL 실행 전: JPQL 또는 Native Query 실행 전에 변경 사항이 반영되어 쿼리 결과의 정확성을 보장합니다.
- 명시적으로 호출 시:
entityManager.flush()또는repository.flush()메서드로 직접 호출할 수 있습니다.
Flush의 필요성
- 일관성 보장: JPQL 실행 전 Flush를 호출하여 데이터베이스와 영속성 컨텍스트 간의 일관성을 보장합니다.
- 조기 반영: 트랜잭션 종료 전에 데이터베이스에 변경 사항을 조기 반영하고 싶을 때 명시적으로 호출합니다.
나는 무엇을 테스트?
4.5 시나리오 결과
- 주문 생성
- 주문 생성 → 재고 감소 → 결제 성공 시, 트랜잭션이 정상적으로 완료됩니다.
- 결제 실패 또는 재고 부족 등의 상황 발생 시, 모든 작업이 롤백됩니다.
- 환불 처리
- 환불 요청 시, 주문 데이터를 확인하고 재고를 복원합니다.
수업 내용 필기 정리.
- 동일 클래스 내에서 하나의 트랜잭션으로 묶을 수 있다. *
This post is licensed under CC BY 4.0 by the author.