✅ 더티체킹이란?
Dirty Checking은 영속성 컨텍스트(Persistence Context)에서 엔티티(Entity)의 변경 사항을 자동으로 감지하고, 변경된 내용만을 데이터베이스에 동기화하는 기능이다. 이는 영속성 컨텍스트에서 Entity를 스냅샷으로 상태 변화를 추적하고 있기 때문에 가능하다.
💡
—파일시스템의 Dirty Checking
JPA의 Dirty Checking의 개념은 파일 시스템의 Dirty Checking의 개념에서 나왔다. 디스크에 데이터를 저장하는 것은 많은 리소스 비용이 발생하기 때문에 파일 시스템은 메모리에 변경된 데이터를 모아서 디스크에 일괄 쓰거나 적절한 시간에 쓰도록 조절함으로써, 비용이 많이 드는 디스크 쓰기 작업의 수를 줄일 수 있다.
@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()
메소드를 다시 실행시켜서 저장해야할 것 같지만, 영속성 컨텍스트로 관리되는 객체라면 이러한 코드를 생략하는 것을 자주 볼 수 있다.
🏷️이미지 출처 및 참고한 사이트
더티 체킹 (Dirty Checking)이란?
Spring Data Jpa와 같은 ORM 구현체를 사용하다보면 더티 체킹이란 단어를 종종 듣게 됩니다. 더티 체킹이란 단어를 처음 듣는분들을 몇번 만나게 되어 이번 시간엔 더티 체킹이 무엇인지 알아보겠습니다. 모든 코드는 Github에 있습니다. 예를 들어 다음과 같은 코드가 있습니다. (Spring Data Jpa가 익숙하시겠지만, 네이티브한 코드 먼저 보고 가겠습니다.) @Slf4j @RequiredArgsConstructor @Service public class PayService { public void updateNative(Long id, String tradeNo) { EntityManager em = entityManagerFactory.createEntityManager(); Enti..
Uploaded by N2T