728x90
✅ 변경 감지 (Dirty Checking)란?
📌 JPA는 엔티티 객체의 "처음 상태"를 기억하고 있다가,
트랜잭션이 끝나기 전에 그 객체가 변경되었는지를 확인해.
만약 변경됐다면 → 자동으로 UPDATE SQL을 만들어서 DB에 반영해줘.
🎯 어떻게 작동하는지?
- 트랜잭션 시작
- JPA가 DB에서 엔티티를 조회해서 영속성 컨텍스트에 저장
- 개발자가 객체의 값을 setter 등으로 수정
- 트랜잭션 커밋 시점에 → JPA가 처음 상태와 지금 상태를 비교
- 바뀐 부분만 UPDATE SQL을 생성해서 실행!
🧠 예제 코드로 보기
@Transactional
public void updatePostTitle(Long id, String newTitle) {
Post post = entityManager.find(Post.class, id); // 1차 캐시 등록 (영속 상태)
post.setTitle(newTitle); // 필드 값 변경 (하지만 아직 DB엔 반영 안됨!)
// 트랜잭션 커밋 시점에 변경 감지 → UPDATE SQL 자동 생성
}
🔍 개발자는 update 쿼리를 전혀 작성하지 않았는데,
JPA가 알아서 update 해준다는 게 핵심이야!
🔧 변경 감지가 가능한 이유?
JPA가 영속성 컨텍스트에 객체를 보관하면서,
초기 상태의 스냅샷을 같이 가지고 있기 때문이야.
즉, 엔티티의 필드가 수정되었는지 감시하고 있다가
트랜잭션 커밋 전에 DB와 싱크를 맞춰주는 거지.
⚠️ 주의할 점
- 변경 감지는 영속 상태(EntityManager가 관리 중인 객체) 에만 적용돼.
- 즉, new로 생성해서 관리되지 않는 객체는 감지 안 돼.
- @Transactional 없이 실행되면 반영되지 않음 (flush 시점이 없음).
🖼️ 흐름 이미지로 요약
[DB 조회] ---> [영속성 컨텍스트 저장] ---> [객체 수정] ---> [커밋 전 변경 감지] ---> [UPDATE 쿼리 자동 실행]
728x90
'프로그래밍 > Spring' 카테고리의 다른 글
🌙JPA 매핑 어노테이션 가이드 (0) | 2025.04.07 |
---|---|
커밋, 롤백, 트랜잭션, flush()과 커밋의 차이점 (0) | 2025.04.07 |
✅ Write-Behind (쓰기 지연) 란? (0) | 2025.04.07 |
⚾️ JPA 1차 캐시 (First-Level Cache) 완전 정복 (0) | 2025.04.07 |
🌿 JPA의 핵심! Persistence Context(영속성 컨텍스트) 완벽 정리 (0) | 2025.04.07 |