🧹 JPA Dirty Checking

정의

Dirty Checking영속성 컨텍스트가 관리하는 엔티티의 변경 여부를 자동으로 감지하는 기능이다. 엔티티의 값이 바뀌면 트랜잭션 커밋 시점에 변경 내용을 DB에 반영한다.

직접 UPDATE를 호출하지 않아도 엔티티 상태 변경만으로 수정 쿼리가 발생한다.

🧩 동작 흐름

  1. 영속성 컨텍스트가 엔티티를 처음 관리할 때 스냅샷을 만든다.
  2. 엔티티의 필드 값이 변경되면 영속성 컨텍스트가 변경 여부를 추적한다.
  3. 트랜잭션 커밋 또는 flush 시점에 현재 상태와 스냅샷을 비교한다.
  4. 차이가 있으면 UPDATE SQL이 생성되어 DB에 반영된다.

🧩 역할

  • 엔티티 변경을 자동 감지한다
  • 수정 쿼리를 직접 작성하지 않아도 된다
  • 영속성 컨텍스트와 DB 상태를 동기화한다
  • 엔티티 중심 개발을 가능하게 한다

🛠 사용 예시

@Transactional
public void updateUserName(Long userId, String userName) {
    User user = userRepository.findById(userId)
            .orElseThrow();
    user.changeUserName(userName);
}
public class User {

    private String userName;

    public void changeUserName(String userName) {
        this.userName = userName;
    }
}

위처럼 영속 상태의 엔티티 값을 변경하면 Dirty Checking이 동작한다.

🧩 특징

  • save()가 아니라도 영속 상태 엔티티는 변경 추적 대상이 된다.
  • 보통 flush 또는 커밋 시점에 DB 반영이 일어난다.
  • 스냅샷과 현재 상태를 비교해서 변경 여부를 판단한다.
  • 변경된 필드가 많으면 기본적으로 전체 컬럼 UPDATE가 발생할 수 있다.

⚠️ 주의사항

  • Dirty Checking은 영속 상태의 엔티티에만 적용된다.
  • 트랜잭션이 없으면 정상적으로 반영되지 않을 수 있다.
  • 엔티티를 직접 조회한 뒤 값만 바꾸는 패턴과 잘 맞는다.
  • UPDATE 컬럼을 줄이고 싶다면 @DynamicUpdate를 함께 고려할 수 있다.

📌 정리

  • Dirty Checking은 JPA가 엔티티 변경을 자동 감지하는 기능이다.
  • 트랜잭션 커밋 시점에 스냅샷과 비교해 UPDATE를 반영한다.
  • 엔티티 중심 개발에서 매우 중요한 동작 원리다.

연결문서

태그: ,

카테고리:

업데이트:

댓글남기기