10월 2일 - 더티 체킹 (Dirty Checking)

Yullgiii·2024년 10월 2일
0

[Spring Data JPA] 더티 체킹 (Dirty Checking)

더티 체킹은 트랜잭션 안에서 엔티티(Entity)의 변경이 일어났을 때, 변경된 내용을 자동으로 데이터베이스에 반영하는 것이다. JPA를 사용하면, 더티 체킹이라는 용어를 자주 듣게 된다. 이 개념이 무엇인지 간단히 알아보자.

더티 체킹이란?

더티 체킹은 Entity에서 변경된 부분을 감지하여, 그 내용을 데이터베이스에 반영하는 것을 말한다. 더티 체킹을 통해 개발자는 명시적인 update 쿼리를 작성하지 않아도 된다. 이를 통해 코드의 간결성과 유지보수성을 높일 수 있다.

예시: 주문 취소 기능

@Transactional  
public void cancelOrder(Long orderId) {  
    // 주문 엔티티 조회  
    Order order = orderRepository.findOne(orderId);  

    // 주문 취소  
    order.cancel();  
}

위의 cancelOrder 메소드를 보면, 주문 취소 로직이 실행되지만, update 쿼리는 없다. 그러나 JPA에서는 트랜잭션이 끝나는 시점에 데이터베이스에 변경된 내용이 반영된다.

더티 체킹 과정

  1. 트랜잭션 시작
  2. orderId로 주문 Entity 조회
  3. 해당 Entity의 주문 상태를 취소로 변경
  4. 트랜잭션 커밋

트랜잭션이 끝나는 시점에 JPA는 해당 엔티티의 상태 변화를 감지하고, 변경된 내용을 데이터베이스에 update 쿼리로 반영해준다. 이를 더티 체킹이라고 한다.

더티 체킹 작동 방식

  1. JPA에서 Entity 조회
  2. 조회된 상태의 Entity에 대한 스냅샷 생성
  3. 트랜잭션이 커밋되기 직전, 스냅샷과 현재 상태의 엔티티를 비교
  4. 변경된 내용이 있다면 데이터베이스에 update 쿼리 전달

여기서 주의할 점은 더티 체킹은 영속성 컨텍스트가 관리하는 엔티티에만 적용된다는 것이다. 준영속, 비영속 상태의 엔티티는 값이 변경되어도 데이터베이스에 반영되지 않는다.

@DynamicUpdate

기본적으로 더티 체킹은 엔티티의 모든 필드를 update 쿼리로 전달한다. 하지만 필드가 많아지면 비효율적일 수 있다. 이때 @DynamicUpdate를 사용하면, 변경된 필드만 반영되도록 할 수 있다.

예시: @DynamicUpdate 적용

@Getter
@NoArgsConstructor
@Entity
@DynamicUpdate
public class Order {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String product;

    public void cancel() {
        // 주문 취소 로직
    }
}

위 코드에서 @DynamicUpdate 어노테이션을 사용하면, cancel() 메소드로 인해 변경된 필드만 update 쿼리로 반영된다.

So...

더티 체킹은 JPA가 제공하는 강력한 기능 중 하나로, 명시적인 쿼리 없이 엔티티의 변경 사항을 자동으로 데이터베이스에 반영해준다. 이를 통해 코드의 간결함과 유지보수성을 높일 수 있으며, @DynamicUpdate와 같은 기능을 통해 성능을 더욱 최적화할 수 있다.

profile
개발이란 무엇인가..를 공부하는 거북이의 성장일기 🐢

0개의 댓글