✅ 더티체킹이란?
Dirty Checking은 영속성 컨텍스트(Persistence Context)에서 엔티티(Entity)의 변경 사항을 자동으로 감지하고, 변경된 내용만을 데이터베이스에 동기화하는 기능이다. 이는 영속성 컨텍스트에서 Entity를 스냅샷으로 상태 변화를 추적하고 있기 때문에 가능하다.
@Slf4j
@RequiredArgsConstructor
@Service
public class MemberService {
public void update(Long id, String username) {
EntityManager em = entityManagerFactory.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin(); //트랜잭션 시작
Member member = em.find(Member.class, id);
member.setUsername(username); // 엔티티만 변경
tx.commit(); //트랜잭션 커밋
}
JPA는 엔티티를 영속성 컨텍스트에 보관할 때, 최초 상태를 복사해서 스냅샷 형태로 저장해둔다. 그리고 ㅍㄹ러시 시점에 스냅샷과 엔티티를 비교해서 변경된 엔티티를 찾는다. 변경된 엔티티가 있으면 수정 쿼리를 생성해서 쓰지 지연 SQL 저장소에 보내고 데이터베이스 트랜잭션을 커밋해 데이터 수정을 완료한다.
변경 감지는 영속성 컨텍스트가 관리하는 영속 상태의 엔티티에만 적용된다. 비영속, 준영속처럼 영속성 컨텍스트의 관리를 받지 못하는 엔티티는 값을 변경해도 데이터 베이스에 반영되지 않는다.
실제로 객체의 값을 변경하고 save()
나 update()
메소드를 다시 실행시켜서 저장해야할 것 같지만, 영속성 컨텍스트로 관리되는 객체라면 이러한 코드를 생략하는 것을 자주 볼 수 있다.
🏷️이미지 출처 및 참고한 사이트
Uploaded by N2T