Spring/JPA
(JPA) 플러시와 준 영속 상태
주누
2021. 3. 10. 01:22
플러시
영속성 콘텍스트는 commit을 하는 시점에 쿼리가 날아간다고 이전 포스팅에서 언급하였다.
하나 flush를 사용하면 commit을 하는 시점이 아닌 flush를 하는 시점에 쿼리가 발생한다.
아래 코드는 flush를 하고 나서 구분을 위한 sout을 찍었다!
Member member = new Member(200l, "Member200");
entityManager.persist(member);
entityManager.flush();
System.out.println("*********");
transaction.commit();
실행결과를 보면 flush를 하고 나서 쿼리가 발생하는 것을 볼 수 있다.
flush를 사용하는 이유는 JPQL에서 찾아볼 수 있다. persist가 호출되는 시점에는 DB에 데이터가 저장이 안 된다고 하였다.
하나 persist 바로 이후에 JPQL을 실행을 한다면 DB에 저장이 안 된 시점에서 데이터를 찾기 때문에 제대로 된 데이터를 보장받을 수 없다. 이를 방지하기 위해서 JPQL은 기본적으로 flush를 제공한다.
- 영속성 콘텍스트를 비우지 않는다.
- 영속성 컨텍스트의 변경 내용을 데이터베이스에 동기화한다.
- 트랜잭션이라는 작업 단위가 중요하다.
준영속 상태
준영속 상태란 영속상태의 엔티티가 영속성 콘텍스트에서 분리된 상태를 의미합니다.
- entityManager.detach(entitiy) : 특정 엔티티만 준영속 상태로 전환
- entityManager.clear() : 영속성 콘텍스트를 완전히 초기화
- entityManager.close() : 영속성 컨텍스트를 종료
201이라는 ID를 찾고 이름을 변경한다음 detach를 사용해보자!
Member member = entityManager.find(Member.class, 201L); // 현재는 영속상태
member.setName("jun young sok");
entityManager.detach(member);
select 쿼리만 나가고 update쿼리는 실행되지 않는다. 왜냐면 영속 상태가 아니기 때문에!
References
www.inflearn.com/course/ORM-JPA-Basic/dashboard
Code Link