728x90
반응형
SMALL
학습내용
- 트랜잭션
- Spring 트랜잭션 관리
- Flush와 Dirty Checking
- 실습
학습정리
1. 트랜잭션
- 트랜잭션 개념
- 정의 : 데이터베이스에서 한번에 실행되는 작업 단위, 하나의 논리적 작업 단위가 성공적으로 완료되거나, 전부 실패하도록 보장, 데이터 무결성과 일관성 유지
- 필요성 : 여러 작업이 함께 수행될 때, 중간에 오류가 발생시 이전 작업으로 되돌릴 수 있도록 보장
- ACID
- Atomicity (원자성): 트랜잭션 내의 작업은 모두 성공하거나 모두 실패해야 합니다.
- Consistency (일관성): 트랜잭션 수행 전후 데이터가 일관성을 가져야 합니다.
- Isolation (고립성): 동시에 실행되는 트랜잭션은 서로의 작업에 영향을 미치지 않아야 합니다.
- Durability (지속성): 트랜잭션이 성공적으로 완료되면 그 결과는 영구적으로 반영되어야 합니다.
2. Spring 트랜잭션 관리
@Transactional
트랜잭션을 선언적으로 관리하기 위한 Spring의 에너테이션
메서드나 클래스에 적용하여 범위를 설정 가능
트랜잭션 처리 과정
- 트랜잭션 메서드 호출 : @Transactional이 붙은 메서드가 호출되면, Spring은 AOP를 사용하여 그 메서드를 프록시 객체로 감싸게 됩니다.
- 프록시 객체 생성: 실제 비즈니스 로직을 처리하는 객체는 AOP 프록시 객체로 대체됩니다. 프록시 객체는 원래의 메서드 호출을 가로채고 트랜잭션 처리를 추가합니다.
- 트랜잭션 시작: 메서드가 호출되기 전에 프록시는 트랜잭션을 시작합니다.
- 메서드 실행: 프록시가 원래의 메서드를 실행하도록 위임합니다.
- 트랜잭션 종료: 메서드 실행이 완료되면 트랜잭션을 커밋하거나 롤백합니다.
예제 사용방법
@Service public class OrderService { @Transactional public void createOrder(Order order) { //주문 생성로직 } }
- OrderService 클래스의 createOrder 메서드는 트랜잭션을 적용할 대상이 됩니다.
- OrderService의 실제 객체 대신, 프록시 객체가 사용됩니다.
- @Transactional 어노테이션은 메서드 실행 전후에 트랜잭션을 관리하도록 프록시에게 알려줍니다.
- 트랜잭션 처리 과정에서 데이터베이스 작업이 성공하면 트랜잭션을 커밋하고, 예외가 발생하면 롤백됩니다.
3. Flush와 Dirty Checking
영속성 컨텍스트
JPA에서 엔티티를 관리하기 위해 제공하는 1차 캐쉬 역할
데이터베이스와의 동기화를 효율적으로 관리하며, 데이터 변경 사항 추적
특징
엔티티관리
지연 쓰기
변경 감지 (Dirty Checking)
- 동작원리
- 트랜잭션 시작시 영속성 컨텍스트는 엔티티의 현재 상태를 스냅샷 저장
- 중간에 엔티티 필드가 변경시, 스냅샷과 비교하여 변경된 부분을 감지
- 종료시에 변경된 엔티티에 대해서 update 쿼리
예제
@Transactional public void updateProductStock(Long productId, int quantity) { // 엔티티 조회 Product product = productRepository.findById(productId); // 필드 값 변경 product.reduceStock(quantity); // Dirty Checking 발생 // 별도의 save() 호출이 없어도 트랜잭션 종료 시 변경 사항이 반영됩니다. }
Flush
- 영속성 컨텍스트의 변경 내용을 데이터베이스 동기화 하는 작업
- 동작원리
- 영속성 컨텍스트에 저장된 엔티티의 변경 사항이나 추가된 엔티티 식별
- 변경 사항에 대해서 쿼리 생성
- 생성된 쿼리를 데이터베이스에 전송하여 동기화 수행
- 시점
- 트랜잭션 커밋 시점
- JPQL실행전
- 명시적 호출 entityManager.flush()
- 예제
@Transactional public void createAndFlushOrder(Order order) { // 영속성 컨텍스트에 엔티티 저장 orderRepository.save(order); // Flush 호출: 즉시 데이터베이스에 변경 사항 반영 orderRepository.flush(); }
참고 자료
728x90
반응형
LIST
'TIL' 카테고리의 다른 글
2_5.QueryDSL 활용 (0) | 2025.01.10 |
---|---|
2_4.QueryDSL 설정 및 활용 (0) | 2025.01.10 |
2_2.엔티티 심화, 지연 로딩과 즉시로딩, N+1 문제 (0) | 2025.01.09 |
2_1.DB 설계 기본 개념 및 연관관계 매핑 (0) | 2025.01.09 |
1_5. CRUD 구현과 MapStruct (0) | 2025.01.09 |