dirty checking이란 영속 상태(entityManager가 관리 중인 상태)의 엔티티 값이 바뀌었는지 JPA가 자동으로 감지해서 트랜잭션이 끝날 때(=flush 시점)에 UPDATE SQL을 알아서 날려주는 기능이다.
JPA를 사용하여 데이터를 수정하려면 Entity를 조회하여 조회된 Entity 데이터를 변경만 하면 데이터 베이스에 자동으로 반영이 되도록하는 기능을 바로 Ditry Checking이라고 한다.
JPA는 영속성 컨텍스트를 생성하여 DB와 유사하게 이용하여 Entity의 Life Cycle을 관리한다.
그럼 JPA는 영속성 컨텍스트에 Entity를 보관할 때 최초의 상태를 저장하고 있다. 이것을 스냅샷이라고 하며 영속성 컨텍스트가 Flush되는 시점에 스냅샷과 Entity의 현재 상태를 비교하여 달라진 Entity를 찾는다.
이후 변경된 필드들을 이용하여 쓰기지연 SQL 저장소에 Update 쿼리를 생성하여 쌓아둔다.
모든 작업이 끝나고 트랜잭션을 커밋을 하면 이때 쓰기지연 SQL 저장소에 있는 쿼리들을 DB에 전달항 Update를 진행한다.
@Transactional
public void updateUsername(Long id) {
Member member = memberRepository.findById(id).get(); // 영속 상태
member.setUsername("newName"); // 값 변경
// save() 없음!
}
이 코드에 반영되는 것은?
UPDATE member SET username = 'newName' WHERE id = ?
-> 이게 dirty checking이다.
readOnly = true 라면?
Dirty Checking은 영속성 컨텍스트가 관리하는 엔티티의 변경 사항을 자동으로 감지하여
트랜잭션 커밋 시점에 UPDATE SQL을 생성하는 JPA의 핵심 기능이다.