JPA 내부 동작 방식
영속성 컨텍스트는 Entity Manager 단위로 관리된다.
영속성 컨텍스트에는 1차캐시와 SQL 저장소 등이 존재한다.
Create
Read
Update
Delete
플러시 (flush)
영속성 컨텍스트의 변경 내용을 데이터베이스에 동기화하는 작업을 플러시라고 한다. 플러시가 발생하면 변경된 엔티티를 데이터베이스에 반영하여 일관성을 유지하게 된다.
쉽게 플러시가 되면 SQL 저장소의 쿼리들이 진행이돼고 데이터베이스와 1차캐시의 내용이 동기화 된다.
플러시의 3가지 방법
1. Entity.Manager.flush()을 통한 플러시
2. 커밋을 통한 자동 플러시
3. JPQL 쿼리 실행을 통한 자동 플러시
Entity Lifecycle
영속 객체의 4가지 상태
tx.begin();
try{
Customer customer = new Customer("ID0002", "Park"); // 비영속 상태(New)
em.persist(customer); // 영속 상태 (Managed)
em.detach(customer); // Customer 객체를 준영속 상태로 만든다. 이렇게 하면 Select SQL 문이 나간다.(Detached)
Customer foundcustomer = em.find(Customer.class, "ID0002");
System.out.println(foundcustomer);
tx.commit();
} catch (Exception e) {
tx.rollback();
} finally {
em.close();
}
emf.close();
위의 예시 코드를 보면 EntityManager로 객체를 영속성 컨텍스트에 등록하게되면 영속 상태(Managed)가 된다. 그리고 이 객체를 준영속 상태로 만들기 위해선 detach()메서드를 사용하면된다. 이때 customer객체를 찾을때 Select 문이 사용된다. 그리고 비영속상태가 되면 영속성 컨텍스트의 관리를 받지 않게된다.
이상태에서 find()메서드를 사용해서 같은 객체를 찾으려하면 1차 캐시에 해당 객체가 존재하지 않기 때문에 Select 쿼리문이 사용된다.