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 |