Spring JPA의 Dirty Checking(변경 감지)

LeeYulhee·2024년 7월 29일

👉 Dirty Checking(변경 감지)이란?


  • 엔티티 객체의 상태 변화를 자동으로 감지하여, 데이터베이스에 필요한 변경 사항을 반영하는 메커니즘
  • 발자는 명시적으로 업데이트 쿼리를 작성하지 않아도 엔티티 객체의 필드 값이 변경되면 자동으로 데이터베이스에 반영됨



👉 Dirty Checking의 작동 순서


  1. JPA를 통해 엔티티를 조회
    • JPA는 해당 엔티티를 영속성 컨텍스트(Persistence Context)에 저장하고, 이를 관리하게 됨
  2. 조회한 엔티티의 필드 값을 변경(사용자 등)
    • JPA는 변경된 필드 값을 감지하기 위해 원본 값과 현재 값을 비교함
  3. 트랜잭션을 커밋하면, JPA는 영속성 컨텍스트에 저장된 엔티티 중 변경된 것이 있는지 확인
    • ⇒ @Transactional이 걸려 있어야 Dirty Checking이 실행된다는 뜻
  4. 변경된 엔티티가 있다면, JPA는 자동으로 UPDATE 쿼리를 생성하여 데이터베이스에 반영



👉 Dirty Checking 예시


@Service
public class UserService {
    
    @Autowired
    private UserRepository userRepository;

    @Transactional
    public void updateUserEmail(Long userId, String newEmail) {
        // 1. 엔티티 조회
        User user = userRepository.findById(userId)
                                  .orElseThrow(() -> new RuntimeException("User not found"));

        // 2. 엔티티 변경
        user.setEmail(newEmail);
        
        // 3. 트랜잭션 커밋 시점에 Dirty Checking에 의해 변경 사항이 데이터베이스에 반영됨
    }
}
profile
끝없이 성장하고자 하는 백엔드 개발자입니다.

0개의 댓글