더티 체킹

haruceki·2024년 7월 23일

JPA에서 "더티 체킹(Dirty Checking)"은 엔티티 상태의 변경을 자동으로 감지하여 데이터베이스에 동기화하는 기능이다. 이는 JPA가 엔티티 객체의 변경을 추적하고, 트랜잭션이 커밋될 때 변경된 내용을 자동으로 데이터베이스에 반영하는 메커니즘을 말한다.

더티 체킹이 동작하는 과정

  1. 엔티티의 원본 상태 저장: JPA는 엔티티를 로드할 때, 엔티티의 원본 상태를 내부적으로 저장.

  2. 엔티티의 변경 감지: 엔티티의 속성을 수정하면, JPA는 이 변경을 감지. 하지만 이 단계에서는 아직 데이터베이스에 반영되지 않음.

  3. 변경된 엔티티 추적: 트랜잭션이 커밋되기 전에, JPA는 변경된 엔티티를 모두 추적. 여기서 "더티"는 "변경된"을 의미함.

  4. SQL 생성 및 실행: JPA는 변경된 엔티티에 대해 적절한 SQL UPDATE 쿼리를 생성하고, 트랜잭션이 커밋될 때 이 쿼리를 실행.

더티 체킹의 기본 개념 예시

  1. 엔티티 로딩: 엔티티 매니저를 통해 데이터베이스에서 엔티티를 로드해. 예를 들어, Product라는 엔티티를 로드했다고 가정한다.
코드 복사
Product product = entityManager.find(Product.class, productId);
  1. 엔티티 수정: 로드된 엔티티의 속성을 변경. 예를 들어, price 필드를 수정.
product.setPrice(newPrice);
  1. 트랜잭션 커밋: 트랜잭션을 커밋할 때, JPA는 엔티티의 현재 상태와 원본 상태를 비교. 만약 변경된 부분이 있으면 그 변화를 데이터베이스에 반영.
@Transactional
public void updateProductPrice(Long productId, int newPrice) {
    Product product = entityManager.find(Product.class, productId);
    product.setPrice(newPrice);  // 여기서 엔티티의 상태를 변경
    // 트랜잭션이 커밋되면 더티 체킹이 일어나고, 변경된 값이 DB에 반영됨
}

더티 체킹의 장점

  • 자동 동기화: 개발자가 명시적으로 update 쿼리를 작성할 필요 없이, 엔티티의 변경 사항이 자동으로 데이터베이스에 반영된다.
  • 코드 간결화: 엔티티의 상태 변경과 데이터베이스 동기화를 자동으로 처리하여 코드가 더 간결해진다.

주의 사항

  • 트랜잭션 관리: 더티 체킹은 트랜잭션이 활성화된 상태에서만 작동하므로, @Transactional 어노테이션을 사용하여 트랜잭션을 관리해야 한다.
  • 성능 고려: 대규모 엔티티 변경 시 더티 체킹에 의해 불필요한 업데이트가 발생할 수 있으므로, 성능을 고려하여 필요한 경우 명시적인 업데이트 쿼리를 사용해야 한다.
profile
희망도 절망도 없이 매일 코딩을 한다.

0개의 댓글