본 내용은 유튜브 나무소리님의 강의 내용을 정리한 내용입니다.
JPA 2-2강 영속성 컨텍스트의 이해(1)
엔티티 등록, 조회 동작 방식
- 영속성 컨텍스트는 EntityManager 단위로 관리 됩니다.
- EntityManager.persist()를 통한 영속객체 등록은 우선 해당 객체가 1차 캐시에 저장되고 일반적으로 트랜잭션이 커밋되는 시점에 Insert 쿼리가 데이터베이스에 반영됩니다.
- EntityManager.find()를 통한 데이터 검색은 우선 1차 캐시를 통해 해당 객체를 검색하고 없을 경우 Select 쿼리를 통해 데이터베이스에서 검색을 수행합니다.
이미지 출처: 3.4 영속성 컨텍스트의 특징 · jpa (gitbooks.io)
엔티티 수정 동작 방식
- 영속성 컨텍스트를 통해 관리되는 영속 객체는 객체의 상태 변경에 따라 Update 쿼리가 생성되고 커밋 시점에 데이터베이스에 반영됩니다.
- 객체의 변경 사항은 1차 캐시의 스냅샷(snapshot) 정보를 통해 판별합니다.
- 영속객체의 상태가 변경되면 1차 캐시의 스냅샷과 비교하고 다를 경우 UPDATE 쿼리를 생성하고 SQL 저장소에 저장합니다.
이미지 출처: 3.4 영속성 컨텍스트의 특징 · jpa (gitbooks.io)
플러시(flush)
- 플러시(flush)는 영속성 컨텍스트의 내용을 데이터베이스와 동기화 하는 것을 의미합니다.
- 플러시의 3가지 방식
- EntityManager.flush() 직접 호출을 통한 플러시
- 트랜잭션의 커밋을 통한 자동 플러시
- JPQL 쿼리 실행을 통한 자동 플러시
- 플러시를 실행한 이후에도 영속성 컨텍스트의 내용은 그대로 유지됩니다.
entityManager.persist(customer1);
entityManager.persist(customer2);
entityManager.persist(customer3);
// JPQL - 중간에 조회
query = entityManager.createQuery("select c from costomer_tb c", Customer.class);
List<Customer> customers = query.getResultList();
- JPQL을 사용하여 customer_tb의 모든 데이터를 조회 하려고 합니다.
- 그러나 customer1, customer2, customer3는 아직 commit이 되지 않았기 때문에 데이터베이스에 존재하지 않습니다.
- 그래서 JPQL 실행 시에 플러시를 자동 호출 하여 SQL 저장소의 INSERT 쿼리문이 데이터베이스에 반영된 데이터를 조회 할 수 있게됩니다. (실제로 데이터베이스에 데이터가 변경되지는 않음)