JPA를 사용할 때 쓰기 지연 SQL 저장소에 있는 내용을 DB에 반영하기 위해 사용하는 메서드
플러시의 역할은 영속성 컨텍스트의 변경 내용을 데이터베이스와 동기화 하기위해 사용한다.
엔티티 매니저 내부 메서드를 사용하여 flush()를 호출하는 방식이다. 직접 호출해서 영속성 컨텍스트를 강제 플러시하는 방법이다. 해당 방법은 테스트나, 다른 프레임워크와 JPA를 함께 사용하는 것을 제외하고는 거의 사용하지 않는 방식이다.
flush()를 사용하는 이유는 위에서도 설명했지만 SQL을 만들어서 DB에 전달하는 역할을 수행한다.
때문에 플러시를 하지않고 커밋을 하게되면 SQL없이 커밋이되는 것이기 때문에 아무것도 반영이 되지 않는다.
그래서 커밋 전에 반드시 영속성 컨텍스트의 정보를 플러시를 호출해서 전달해야한다.
JPA에서는 사용자가 플러시를 하지 않을 것을 예방하기 위해 자동으로 플러시를 호출한다.
쓰기 지연 SQL 저장소에 저장하고 플러시를 하지 않은 상태에서 JPQL을 사용하여 엔티티를 조회하면 당연히 데이터가 나오지 않을 것이다. 때문에 JPQL로 쿼리를 실행하기 직전에 JPA에는 플러시를 우선 자동 호출을 하여 DB에 영속성 컨텍스트에서 관리하고 있는 내용을 반영한다.
다만, find를 사용하는 식별자를 사용한 검색에서는 플러시가 수행되지 않는다.
엔티티 매니저의 플러시 옵션을 지정하려면 javax.persistence.FlushModeType을 사용하면 된다.
em.setFlushMode(FlushModeType.COMMIT); //플러시 모드 직접 설정
플러시를 사용한다고 하여 영속성 컨텍스트의 정보 (1차 캐시)가 제거가 되는 것은 아니다.
플러시는 SQL을 DB에 전달하는 것 뿐이다.