-
[Spring] Dirty CheckingSpring 2025. 5. 7. 16:38#Dirty checking
💡 Spring 정리: Dirty Checking — set()만 했는데 update SQL이?
📘 개념 정리
JPA는 em.persist() 이후 엔티티를 계속 감시하고 있다. 엔티티 필드의 변경을 감지(DIRTY CHECKING) 해서
트랜잭션 커밋 직전에 자동으로 update SQL을 생성한다.🔍 Dirty Checking이란?
항목 설명 감시 대상 영속 상태(PERSISTENT)의 엔티티 비교 방식 스냅샷(초기 상태)과 현재 상태를 비교 시점 flush 발생 시 (커밋 or JPQL 전) 결과 변경된 필드만 update SQL 생성됨 🔄 동작 흐름
Member member = em.find(Member.class, 1L); // 영속 상태 member.setAge(30); // 필드 변경 tx.commit(); // flush() → 변경 감지 → update SQL 실행- setAge(30)만 했는데 update SQL이 날아감
- 이유? → flush 시점에 초기 상태와 비교해서 바뀐 걸 JPA가 감지
🔬 내부 동작 구조
시점 상태 find() 1차 캐시에 저장되고, 스냅샷 저장됨 setXXX() 엔티티 상태 변경됨 (스냅샷과 달라짐) flush() 변경 감지 후, 변경된 필드만 update SQL 생성 ⚠️ 실수 및 주의사항
실수 결과 clear() 후 변경 준영속 상태 → 감지 못함 setXXX() 했지만 flush 전 rollback SQL 날아가지 않음 값은 set했지만 트랜잭션이 없거나 커밋 안함 update 실행 안됨 ✨ 요약
- JPA는 영속 상태의 엔티티를 감시하고 있다.
- flush 시점에 스냅샷과 비교하여 변경사항을 감지한다.
- 변경된 필드만 update SQL로 자동 반영된다.
- set()만 했다고 update가 보장되는 건 아님 → flush or commit 필요!'Spring' 카테고리의 다른 글
[Spring] JWT (0) 2025.05.18 [Spring] 1차 캐시 & 동일성 보장 (0) 2025.05.07 [Spring] Flush 시점 (0) 2025.05.07 [Spring] JPA Entity 생명주기 4단계 (0) 2025.05.07 [Spring] 연속성 컨텍스트 (0) 2025.05.07