TIL

2_3.JPA 고급 쿼리 최적화 및 트랜잭션 이해

꿀승 2025. 1. 10. 14:18
728x90
반응형
SMALL

학습내용

  1. 트랜잭션
  2. Spring 트랜잭션 관리
  3. Flush와 Dirty Checking
  4. 실습

학습정리

1. 트랜잭션

  • 트랜잭션 개념
    • 정의 : 데이터베이스에서 한번에 실행되는 작업 단위, 하나의 논리적 작업 단위가 성공적으로 완료되거나, 전부 실패하도록 보장, 데이터 무결성과 일관성 유지
    • 필요성 : 여러 작업이 함께 수행될 때, 중간에 오류가 발생시 이전 작업으로 되돌릴 수 있도록 보장
  • ACID
    • Atomicity (원자성): 트랜잭션 내의 작업은 모두 성공하거나 모두 실패해야 합니다.
    • Consistency (일관성): 트랜잭션 수행 전후 데이터가 일관성을 가져야 합니다.
    • Isolation (고립성): 동시에 실행되는 트랜잭션은 서로의 작업에 영향을 미치지 않아야 합니다.
    • Durability (지속성): 트랜잭션이 성공적으로 완료되면 그 결과는 영구적으로 반영되어야 합니다.

2. Spring 트랜잭션 관리

  • @Transactional

    • 트랜잭션을 선언적으로 관리하기 위한 Spring의 에너테이션

    • 메서드나 클래스에 적용하여 범위를 설정 가능

    • 트랜잭션 처리 과정

      1. 트랜잭션 메서드 호출 : @Transactional이 붙은 메서드가 호출되면, Spring은 AOP를 사용하여 그 메서드를 프록시 객체로 감싸게 됩니다.
      2. 프록시 객체 생성: 실제 비즈니스 로직을 처리하는 객체는 AOP 프록시 객체로 대체됩니다. 프록시 객체는 원래의 메서드 호출을 가로채고 트랜잭션 처리를 추가합니다.
      3. 트랜잭션 시작: 메서드가 호출되기 전에 프록시는 트랜잭션을 시작합니다.
      4. 메서드 실행: 프록시가 원래의 메서드를 실행하도록 위임합니다.
      5. 트랜잭션 종료: 메서드 실행이 완료되면 트랜잭션을 커밋하거나 롤백합니다.
    • 예제 사용방법

      @Service
      public class OrderService {
      
          @Transactional
          public void createOrder(Order order) {
              //주문 생성로직
          }
      }
      • OrderService 클래스의 createOrder 메서드는 트랜잭션을 적용할 대상이 됩니다.
      • OrderService의 실제 객체 대신, 프록시 객체가 사용됩니다.
      • @Transactional 어노테이션은 메서드 실행 전후에 트랜잭션을 관리하도록 프록시에게 알려줍니다.
      • 트랜잭션 처리 과정에서 데이터베이스 작업이 성공하면 트랜잭션을 커밋하고, 예외가 발생하면 롤백됩니다.

3. Flush와 Dirty Checking

  • 영속성 컨텍스트

    • JPA에서 엔티티를 관리하기 위해 제공하는 1차 캐쉬 역할

    • 데이터베이스와의 동기화를 효율적으로 관리하며, 데이터 변경 사항 추적

    • 특징

      • 엔티티관리

      • 지연 쓰기

      • 변경 감지 (Dirty Checking)

        • 동작원리
        1. 트랜잭션 시작시 영속성 컨텍스트는 엔티티의 현재 상태를 스냅샷 저장
        2. 중간에 엔티티 필드가 변경시, 스냅샷과 비교하여 변경된 부분을 감지
        3. 종료시에 변경된 엔티티에 대해서 update 쿼리
        • 예제

          @Transactional
          public void updateProductStock(Long productId, int quantity) {
              // 엔티티 조회
              Product product = productRepository.findById(productId);
          
              // 필드 값 변경
              product.reduceStock(quantity); // Dirty Checking 발생
          
              // 별도의 save() 호출이 없어도 트랜잭션 종료 시 변경 사항이 반영됩니다.
          }
  • Flush

    • 영속성 컨텍스트의 변경 내용을 데이터베이스 동기화 하는 작업
    • 동작원리
      1. 영속성 컨텍스트에 저장된 엔티티의 변경 사항이나 추가된 엔티티 식별
      2. 변경 사항에 대해서 쿼리 생성
      3. 생성된 쿼리를 데이터베이스에 전송하여 동기화 수행
    • 시점
      • 트랜잭션 커밋 시점
      • JPQL실행전
      • 명시적 호출 entityManager.flush()
    • 예제
      @Transactional public void createAndFlushOrder(Order order) { 
          // 영속성 컨텍스트에 엔티티 저장     
          orderRepository.save(order); 
          // Flush 호출: 즉시 데이터베이스에 변경 사항 반영 
          orderRepository.flush(); 
      }

참고 자료

728x90
반응형
LIST