스프링 공부/JPA 기본

[영속성 관리] 플러시

hyun_12 2023. 8. 15. 21:57

플러시

플러시는 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영하는 것이다.

 

트랜잭션이 커밋되면 플러시가 자동으로 발생한다.

플러시가 발생하면 무슨 일이 생길까?

 

- 변경 감지가 발생한다.

- 수정된 엔티티를 쓰기 지연 SQL 저장소에 등록한다.

- 쓰기 지연 SQL 저장소에 있는 등록, 수정, 삭제 쿼리를 데이터베이스에 전송한다. 

 

영속성 컨텍스트를 플러시하는 방법

i) em.flush() - 직접 호출

Member member = new Member(200L, "member200");
em.persist(member);

em.flush(); //플러시 강제 호출

em.persist()-> 영속성 컨텍스트에 엔티티가 담기고, 쿼리가 저장소에 저장된다.

em.flush() -> 저장소의 쿼리가 DB에 반영된다.

 

ii) 트랜잭션 커밋 - 플러시 자동 호출

 

iii) JPQL 쿼리 실행 - 플러시 자동 호출

em.persist(memberA);
em.persist(memberB);
em.persist(memberC);

query = em.createQuery("select m from Member m", Member.class);
List<Member> members = query.getResultList();

em.persist() 후 memberA, memberB, memberC가 영속성 컨텍스트에 저장된다.

하지만 트랜잭션 커밋이나 플러시 호출을 하지 않았으므로, DB에 등록 쿼리가 날아가지 않는다.

 

그러면 DB에서 member를 가져올 수 없다.

이를 방지하기 위해 JPQL 쿼리를 실행할 때 무조건 DB로 쿼리를 날린다.

 

 

정리

플러시를 해도 영속성 컨텍스트 내 1차 캐시가 지워지지 않는다.

쓰기 지연 SQL 저장소에 있는 쿼리만 DB에 날아간다.

 

다시 말해 플러시는 영속성 컨텍스트의 변경 내용을 데이터베이스에 동기화한다.

트랜잭션이라는 작업 단위가 중요하므로 커밋 직전에만 동기화하면 된다.

 

 

 


Reference

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의

초급자를 위해 준비한 [웹 개발, 백엔드] 강의입니다. JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자

www.inflearn.com