JPA를 사용하여 Update를 구현하면 다음과 같이 쿼리를 날리지 않는다.
책에서 공부했던 대로 아무생각없이 작성했다가 의문이들었다.
어라.. Entity클래스에 set만 해주고 save를 하지 않는데.. (이게 되네..?)
그리하여 알아보았습니다🫠
이것이 가능했던 이유는 바로 JPA의 더티 체킹(Dirty Checking) 덕분이었다.
Dirty
는 엔티티 데이터의 변경된 부분으로 해석 할 수 있는데, JPA는 이런 부분을 Checking
해서 데이터베이스에 반영을 해준다.
더티 체킹이 일어나기 위해서는 두 가지 조건이 충족되어야 하는데
- 영속 상태(Managed)의 엔티티
- Transaction 안에서 엔티티를 변경
영속성 컨텍스트
가 관리하는 엔티티에만 검사가 적용된다. 준영속, 비영속 상태의 엔티티는 검사 대상이 아니다 !
JPA는 엔티티 최초 조회 시에 스냅샷
을 생성한다.
트랜잭션 종료 시점에 스냅샷과 비교 후 변경 사항이 있는 경우 Update query
를 날린다.
이 때 JPA는 기본적으로 모든 필드를 update 한다. 이는 쿼리의 재사용성을 높이기 위함인데 필드가 많아 부담이 되는 경우에는 @DynamicUpdate
로 변경 필드만 update가 가능하다고 한다.
테스트 해보니
update 쿼리가 잘 날아가고 있었다.
Entity 클래스에서는 두개의 필드만 set해주고 있지만 쿼리에는 모든 필드가 update되고 있는것을 확인할 수 있었다.