728x90

✅ 변경 감지 (Dirty Checking)란?

📌 JPA는 엔티티 객체의 "처음 상태"를 기억하고 있다가,
트랜잭션이 끝나기 전에 그 객체가 변경되었는지를 확인해.
만약 변경됐다면 → 자동으로 UPDATE SQL을 만들어서 DB에 반영해줘.

 


🎯 어떻게 작동하는지?

  1. 트랜잭션 시작
  2. JPA가 DB에서 엔티티를 조회해서 영속성 컨텍스트에 저장
  3. 개발자가 객체의 값을 setter 등으로 수정
  4. 트랜잭션 커밋 시점에 → JPA가 처음 상태와 지금 상태를 비교
  5. 바뀐 부분만 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