더티 체킹(Dirty Checking) 이란?
더티 체킹은 Transaction 안에서 엔티티의 변경이 일어나면, 변경 내용을 자동으로 데이터베이스에 반영하는 JPA 특징입니다.
Dirty Checking의 뜻은 변경 감지 정도로 생각할 수 있습니다. 변경을 감지해서 DB에 반영합니다.
데이터베이스에 변경 데이터를 저장하는 시점
1. Transaction Commit
2. EntityManager Flush
3. JPQL 사용
JPA에서는 트랜잭션이 끝나는 시점에서 변화가 있는 모든 엔티티 객체를 데이터베이스에 자동으로 반영해줍니다.
변화의 기준은 최초 조회 상태
JPA에서는 엔티티를 조회하면 해당 엔티티의 조회 상태 그대로 스냅샷을 만듭니다.
트랜잭션이 끝나는 시점에 스냅샷과 현재의 상태를 비교해 다른점이 있다면 Update Query를 데이터베이스로 전달합니다.
더티 체킹을 진행하는 검사의 대상
영속성 컨텍스트가 관리하는 엔티티를 대상으로 합니다.
- detach된 엔티티 (준영속)
- DB에 반영되기 전 처음 생성된 엔티티 (비영속)
준영속/비영속 상태의 엔티티는 더티 체킹에 해당사항이 없습니다.
값을 변경해도 데이터베이스에 반영되지 않음.
변경 감지는 엔티티 객체 관점에서 보면 원하는 내용만 변경합니다.
하지만, 기본적으로 Dirty Checking이 실행하는 SQL은 변경된 엔티티의 모든 내용을 Update Query로 만들어서 전달합니다.
전체 필드를 업데이트 하는 방식의 장점
- 생성되는 쿼리가 같아 부트 실행 시점에 미리 만들어서 재사용이 가능합니다.
- 데이터베이스 입장에서 쿼리 재사용이 가능합니다. (동일한 쿼리를 받으면 이전에 파싱된 쿼리를 재사용)
@DynamicUpdate
필드가 많을 경우 전체 필드 Update 쿼리가 부담스러울 수 있음
이런 경우에 @DynamicUpdate 어노테이션을 사용하여 변경한 필드만 반영되도록 할 수 있습니다.
참고: https://velog.io/@jiny/JPA-%EB%8D%94%ED%8B%B0-%EC%B2%B4%ED%82%B9Dirty-Checking-%EC%9D%B4%EB%9E%80
'Back-end > JPA' 카테고리의 다른 글
[JPA] MapStruct DTO <-> Entity (0) | 2022.03.08 |
---|---|
[JPA] 복합 기본키 설정 (0) | 2022.03.08 |
[JPA] Fetch Type란? (0) | 2021.11.22 |
[JPA] N+1 문제가 발생하는 이유와 해결 방법 (0) | 2021.11.22 |
[JPA] JPA Propagation 전파 단계 (0) | 2021.11.22 |