👉 Dirty Checking(변경 감지)이란?
- 엔티티 객체의 상태 변화를 자동으로 감지하여, 데이터베이스에 필요한 변경 사항을 반영하는 메커니즘
- 발자는 명시적으로 업데이트 쿼리를 작성하지 않아도 엔티티 객체의 필드 값이 변경되면 자동으로 데이터베이스에 반영됨
👉 Dirty Checking의 작동 순서
- JPA를 통해 엔티티를 조회
- JPA는 해당 엔티티를 영속성 컨텍스트(Persistence Context)에 저장하고, 이를 관리하게 됨
- 조회한 엔티티의 필드 값을 변경(사용자 등)
- JPA는 변경된 필드 값을 감지하기 위해 원본 값과 현재 값을 비교함
- 트랜잭션을 커밋하면, JPA는 영속성 컨텍스트에 저장된 엔티티 중 변경된 것이 있는지 확인
- ⇒
@Transactional이 걸려 있어야 Dirty Checking이 실행된다는 뜻
- 변경된 엔티티가 있다면, JPA는 자동으로 UPDATE 쿼리를 생성하여 데이터베이스에 반영
👉 Dirty Checking 예시
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
@Transactional
public void updateUserEmail(Long userId, String newEmail) {
User user = userRepository.findById(userId)
.orElseThrow(() -> new RuntimeException("User not found"));
user.setEmail(newEmail);
}
}