본문 바로가기
JPA Study

더티 체킹(Dirty Checking) ( 변경 감지 )

by xogns93 2024. 9. 23.

더티 체킹(Dirty Checking)은 JPA(Java Persistence API)에서 사용되는 중요한 개념 중 하나로, 엔티티의 상태 변화를 자동으로 감지하여 데이터베이스와 동기화하는 기능을 의미합니다.

더티 체킹 동작 방식:

  1. 엔티티 조회: JPA를 통해 데이터베이스에서 엔티티를 조회하면, 해당 엔티티는 영속성 컨텍스트(Persistence Context)에 의해 관리됩니다.
  2. 엔티티 수정: 애플리케이션 코드에서 조회한 엔티티의 필드를 변경하면, JPA는 특별한 명시적 업데이트 요청 없이도 자동으로 이 변화를 감지합니다.
  3. 변경 감지: 트랜잭션이 끝나기 전에, JPA는 더티 체킹을 통해 관리 중인 엔티티들의 상태를 검사하고, 초기 상태와 비교하여 변경된 부분이 있는지 확인합니다.
  4. 자동 업데이트: 만약 변경 사항이 감지되면, JPA는 자동으로 해당 엔티티에 대한 UPDATE 쿼리를 생성하여 데이터베이스에 반영합니다.

더티 체킹의 특징:

  • 명시적으로 save()나 update() 메서드를 호출하지 않아도 JPA가 변경을 자동으로 감지하고 반영합니다.
  • 엔티티가 영속성 컨텍스트에 포함된 상태일 때만 작동합니다. 즉, 관리되는 엔티티만 더티 체킹 대상이 됩니다.
  • 트랜잭션 종료 시점에 한 번에 모든 변경 사항을 처리하므로, 성능을 향상시킬 수 있습니다.

예시 : 

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    private String name;

    // Getter, Setter 생략
}

// 서비스 코드
@Transactional
public void updateUserName(Long userId, String newName) {
    User user = em.find(User.class, userId);  // 영속성 컨텍스트에서 엔티티 조회
    user.setName(newName);  // 엔티티의 필드 값을 변경
    // 더티 체킹에 의해 트랜잭션 종료 시 자동으로 UPDATE 쿼리가 발생함
}

이처럼 더티 체킹은 엔티티의 변경을 자동으로 감지하여 데이터베이스와 동기화하는 기능을 제공하여, 개발자가 일일이 데이터베이스 상태를 관리하지 않아도 되게끔 해줍니다.