[JPA] Dirty Checking 더티 체킹을 알아보자

울상냥·2023년 3월 17일
0

JPA

목록 보기
4/4

JPA를 사용하여 Update를 구현하면 다음과 같이 쿼리를 날리지 않는다.

책에서 공부했던 대로 아무생각없이 작성했다가 의문이들었다.
어라.. Entity클래스에 set만 해주고 save를 하지 않는데.. (이게 되네..?)
그리하여 알아보았습니다🫠


이것이 가능했던 이유는 바로 JPA의 더티 체킹(Dirty Checking) 덕분이었다.

Dirty Checking 이란

Dirty는 엔티티 데이터의 변경된 부분으로 해석 할 수 있는데, JPA는 이런 부분을 Checking 해서 데이터베이스에 반영을 해준다.

더티 체킹이 일어나기 위해서는 두 가지 조건이 충족되어야 하는데

  1. 영속 상태(Managed)의 엔티티
  2. Transaction 안에서 엔티티를 변경

영속성 컨텍스트가 관리하는 엔티티에만 검사가 적용된다. 준영속, 비영속 상태의 엔티티는 검사 대상이 아니다 !

JPA는 엔티티 최초 조회 시에 스냅샷을 생성한다.
트랜잭션 종료 시점에 스냅샷과 비교 후 변경 사항이 있는 경우 Update query를 날린다.

이 때 JPA는 기본적으로 모든 필드를 update 한다. 이는 쿼리의 재사용성을 높이기 위함인데 필드가 많아 부담이 되는 경우에는 @DynamicUpdate로 변경 필드만 update가 가능하다고 한다.


테스트 해보니

update 쿼리가 잘 날아가고 있었다.
Entity 클래스에서는 두개의 필드만 set해주고 있지만 쿼리에는 모든 필드가 update되고 있는것을 확인할 수 있었다.

profile
안되면 되게하라

0개의 댓글