Dev/Spring

변경 감지(Dirty Checking)

oxdjww 2023. 11. 20. 23:43
728x90
반응형

✅ 영속성 컨텍스트란

  • ‘엔티티를 영구히 저장하는 환경’이라는 뜻
  • EntityManager.persist(entity);
  • 하지만 이는 논리적인 개념이다.
  • 엔티티 매니저를 통해서 영속성 컨텍스트에 접근할 수 있다.
  • 아래의 예를 통해 영속성 컨텍스트 내에서 변경 감지(Dirty Checking)를 하는 법을 알아보자.

✅ 엔티티 수정

EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");

        // 단일 EntityManger를 생성한다.
        EntityManager em = emf.createEntityManager();

        EntityTransaction tx = em.getTransaction();

                // 트랜잭션 시작한다. (영속성 컨텍스트)
        tx.begin();

        try {
                        // memberA라는 아이디를 가진 Member 엔티티를 조회한다.
                        Member memberA = em.find(Member.class, "memberA")

                        // 꺼내온 엔티티의 값을 수정한다.
                        memberA.setUserName("hi");
                        memberA.setAge(10);

            // 그리고 트랜잭션을 커밋하면 어떻게 될까?
            tx.commit();
        } catch (Exception e) {
            tx.rollback();
        } finally {
            em.close();
        }

        emf.close();
    }
  • 커밋 전에, em.update(member) 이런 코드를 통해 영속성 컨텍스트에 update를 해주어야 할 것 같다.
  • 하지만 변경 감지 기능이 수정사항을 확인하여 이를 처리해준다.

✅ 변경 감지(Dirty Checking)

  • tx.commit(); 을 하게 되면, 바로 커밋이 이루어지진 않는다.
  • flush() 를 통해서 영속성 컨텍스트에 수정사항이 있는지 확인하는 작업이 이루어진다.
  • 그 후, 이에 맞게 쓰기 지연 저장소에 SQL을 생성한다. (등록, 수정, 삭제 쿼리)
  • 생성된 SQL을 실행하고, 커밋한다.

🌱 Flush

  • em.flush() : 직접 호출
  • 트랜잭션 커밋 : 플러시 자동 호출
  • JPQL 쿼리 실행 : 플러시 자동 호출

💎 JPQL

  • JPQL 실행 시 왜 플러시가 자동 호출될까?
em.persist(memberA);
em.persist(memberB);
em.persist(memberC);//중간에 JPQL 실행
query = em.createQuery("select m from Member m", Member.class);
List<Member> members= query.getResultList();
  • 중간에 저런 쿼리가 실행되는 상황이라면 어떨까
  • 분명히 memberA, memberB, memberC를 넣었는데, 조회되지 않는 상황이 나온다.
  • JPQL을 실행하여 쿼리문을 직접 실행하기 직전에 내부적으로 flush()를 통해 이런 상황을 방지한다.

💎 Flush Options

  • em.setFlushMode(FlushModeType.COMMIT)
  • FlushModeType.AUTO : 커밋이나 쿼리를 실행할 때 플러시 (기본값)
  • FlushModeType.COMMIT : 커밋할 때만 플러시

Ref

김영한 강사님, JPA 프로그래밍 - 기본편


감사합니다.

728x90
반응형

'Dev > Spring' 카테고리의 다른 글

연관관계 매핑(양방향)  (0) 2023.11.21
연관관계 매핑(단방향)  (0) 2023.11.21
JPA를 왜 쓸까?  (0) 2023.11.20
영속성 컨텍스트란  (0) 2023.11.20
준영속과 변경감지  (0) 2023.10.25