여기서 Dirty란, 부정적인 의미가 아닌 ‘상태의 변화가 생겼다’ 라는 의미로 해석
→ Dirty Checking
: 상태 변경 검사
더티 체킹은 Transaction 안에서 엔티티의 변경이 일어나면, 변경 내용을 자동으로 데이터베이스에 반영하는 JPA 특징이다.
그렇다면, 엔티티의 변경이 일어났을 때 데이터베이스에 변경 데이터를 저장하는 시점은 언제인가?
1) Transaction commit 시점
2) EntityManager flush 시점
3) JPQL 사용 시점
더티 체킹이 일어나기 위해서는 영속 상태(Managed)안에 있는 엔티티이여야하며, Transaction 안에서 엔티티를 변경하는 경우이여야 한다.
다음과 같이 더티체킹이 일어나서 user의 업데이트에 대한 메서드를 호출하지 않았음에도 불구하고, Query가 발생됨
@Service
public class ExampleService {
@Transactional
public void updateInfo(Long id, String name) {
User user = userRepository.findById(id);
user.setName(name);
}
}
public void updateInfo() {
User user = userRepository.findById(2L)
.orElseThrow(() -> new ErrorCodeException(ErrorType.USER_IS_NOT_EXISTING));
user.setEmail("hello@gmail.com");
System.out.println(userRepository.existsByEmail("hello@gmail.com"));
}
@Transactional를 사용한 경우와 사용하지 않은 경우를 비교해보자.