ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring] Dirty Checking
    Spring 2025. 5. 7. 16:38

    minecraft-font

    #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
Designed by Tistory.