본문 바로가기

JPA

flush

 

code-mania.tistory.com/12에서 살펴봤듯이 flush는 영속성 컨텍스트의 내용을 DB에 반영하는 메서드이다.

flush 내부 동작은 다음과 같다.

1. 변경 감지 - 수정된 엔티티를 감지하여 쓰기 지연 SQL에 저장소에 등록
2. 쓰기 지연 SQL 저장소의 쿼리들을 DB에 전송

flush를 하는 방법

em.flush(); - EntityManager 객체의 flush 메서드를 직접 호출한다.

transaction.commit(); - Transaction 객체의 commit 메서드를 호출하면 flush 메서드가 자동호출된다.

em.createQuery("select M from Member M"); - JPQL 실행 시 flush 메서드가 자동호출된다.

 

JPQL 실행 시 flush가 자동으로 실행되는 이유

entityManager.persist(entity1);
entityManager.persist(entity2);
entityManager.persist(entity3);
entityManager.createQuery("select e from Entity e", Entity.class);

위 코드에서 JPQL 실행 시 flush가 이루어지지 않으면 persist한 객체들은 조회되지 않는다.

이러한 현상 방지를 위해 JQPL 실행 시 flush가 자동으로 실행된다.

flush 모드 옵션

em.setFlushMode(FlushModeType.COMMIT);

위와 같은 메서드를 통해 플러시모드를 설정할 수 있다.

 

FlushMode의 종류

1. FlushModeType.AUTO -> Default값으로 커밋이나 JPQL 실행 시 자동으로 실행된다.

2. FlushModeType.COMMIT -> 트랜잭션 커밋 시에만 플러시를 실행한다.

flush 주의점

flush를 한다고 해서 1차 캐시가 지워지지 않는다. flush는 그저 영속성 컨텍스트의 내용을 DB에 반영할 뿐이다.

또한 flush를 한다고 해서 커밋이 되는 것은 아니기때문에 DB에 적용되는 것은 아니다.
트랜잭션이라는 작업 단위가 중요하고, 단순히 생각하면 커밋 직전에만 동기화(flush)하면 된다.

'JPA' 카테고리의 다른 글

DB 스키마 자동 생성  (0) 2021.02.14
객체와 Table 매핑  (0) 2021.02.14
영속성 컨텍스트의 장점  (0) 2021.02.13
영속성 컨텍스트  (0) 2021.02.13
JPA로 CRUD해보기(4) JPQL  (0) 2021.02.09