• JPA Dirty Checking

    2025. 1. 13.

    by. hyunji1109

     

    JPA 더티 체킹(Dirty Checking)

    엔티티(Entity)의 변경 사항을 자동으로 감지하여 데이터베이스에 반영하는 JPA의 기능이다.
    개발자가 변경된 데이터를 데이터베이스에 업데이트하는 SQL 문을 작성하지 않아도 JPA가 알아서 처리한다.

    ❓ 엔티티 매니저의 메서드는 저장(persist)/조회(find)/삭제(delete)로 수정에 해당하는 메서드가 없다.  

     

     

    동작원리

    1. 엔티티 상태 감시

    • JPA는 Persistence Context(영속성 컨텍스트)에 의해 엔티티 객체를 관리한다.
    • 영속성 컨텍스트는 엔티티의 스냅샷(초기 상태)을 저장해 둔다.

     

    2. 변경 사항 감지

    • 트랜잭션이 커밋되거나, 영속성 컨텍스트의 flush()가 호출될 때 JPA는 스냅샷과 현재 엔티티 상태를 비교한다.
    • 두 상태를 비교하여 변경된 필드가 있으면 해당 변경 사항을 반영하는 UPDATE SQL을 생성한다.

     

    3. 데이터베이스에 반영

    • 변경된 엔티티에 대해 자동으로 SQL 문을 실행해 데이터베이스에 반영한다.

     

    예제

    @Entity
    @Getter
    @Setter
    public class Member {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
        private String name;
        private int age;
    }
    
    @Transactional
    public void updateMember(Long id, String newName, int newAge) {
        Member member = em.find(Member.class, id); 
        member.setName(newName); // 필드 값 변경
        member.setAge(newAge);
        // 트랜잭션 커밋 시점에 변경 사항 자동 반영
    }

     

    setName과 setAge로 엔티티 값을 변경하면 트랜잭션 커밋 시점에 더티 체킹이 발생

    UPDATE Member SET name = ?, age = ? WHERE id = ?;

     

    'CS > 웹개발' 카테고리의 다른 글

    JPA N+1 문제  (0) 2025.01.19
    CI/CD  (1) 2025.01.16
    google.com을 검색했을 때 일어나는 과정  (0) 2025.01.08
    OAuth  (0) 2025.01.06
    OSI 7계층  (0) 2025.01.05

    댓글