김영한님이 지음, [자바 ORM 표준 JPA 프로그래밍] 책을 읽고 정리한 필기입니다.📢
플러시
플러시(flush()
)는 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영하는 것을 말한다.
플러시 시 일어나는 일
- 변경 감지가 동작하여 영속성 컨텍스트에 있는 모든 엔티티를 스냅샷과 비교하여 수정된 엔티티를 찾고 수정 쿼리를 쓰기 지연 SQL 저장소에 저장
- 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송(등록, 수정, 삭제 쿼리)
영속성 컨텍스트를 플러시 하는 방법
-
flush()
직접 호출- 엔티티 매니저의
flush()
메소드를 직접 호출하는 것, 테스트나 다른 프레임워크와 JPA를 함께 사용할 때는 제외하곤 거의 사용하지 않음
- 엔티티 매니저의
-
트랜잭션 커밋 시 자동 호출
-
JPQL 쿼리 실행 시 자동 호출
-
JPQL, Criteria 호출 시 에도 플러시가 실행 됨. Why? 다른 객체의 커밋 전 JPQL 실행 되면 커밋 전의 내용들이 반영되어 동작하지 않기 때문
1 2 3 4 5 6 7
em.persist(memberA); em.persist(memberB); em.persist(memberC); //중간 JPQL 실행 query = em.createQuery("select m from Member m", Member.class); List<Member> members = qeury.getResultList(); //flush()를 내부적으로 안했다면 위의 memberA, memberB, memberC 가 조회되지 않음
-
플러시 모드 옵션
FlushModeType.AUTO
: 커밋이나 쿼리를 실행할 때 플러시(기본값)FlushModeType.COMMIT
: 커밋할 때만 플러시
1
em.setFlushMode(FlushModeType.COMMIT); //EntityManager에 플러시 모드 직접 설정
플러시라는 이름으로 영속성 컨테이너의 엔티티를 지운다는 오해X → 플러시는 영속성 컨텍스트의 변경 내용을 데이터베이스에 동기화 하는 것이다.
댓글남기기