JPA

[JPA] 플러시 flush란?

솔솔 2021. 6. 30. 09:52
반응형

플러시 flush란?

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

- 영속성 컨텍스트를 비우지 않음

- 영속성 컨텍스트의 변경내용을 데이터베이스에 동기화

- 트랜잭션이라는 작업 단위가 중요 -> 커밋 직전에만 동기화하면 됨

 

플러시가 발생되는 시점

- 변경 감지

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

- 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송 (등록, 수정, 삭제 쿼리)

 

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

  • em.flush() : 직접 호출하는 것, 사용은 안하지만 알아만 둘 것
Member member = new Member(200L, "member200");
em.persist(member);
			
// 강제 호출
em.flush();
			
System.out.println("===============");

// 커밋
tx.commit();

시점을 확인해보면 원래는 commit 되는 시점에 쿼리가 전송되었지만, 플러시를 사용하면 커밋되기 전 쿼리가 전송되고 commit 시점에 commit 된다.

** 플러시가 전송되었다고 해서 캐시가 지워지거나 하지는 않는다.

 

  • 트랜잭션 커밋 : 플러시 자동 호출
  • JPQL 쿼리 실행 : 플러시 자동 호출

-> JPQL 쿼리 실행시 플러시가 자동 호출되는 이유는? 

우리가 지금까지 배운 것으로는 persist 를 하면 DB에 저장이 안되고 캐시에 저장만 되어있는 상태인데

JPQL쿼리를 사용해서 Member 테이블의 모든 데이터를 가지고 오면 위에 3개의 데이터가 출력될까?

DB 처리가 안되었기때문에 가져올 수 없다! 

그래서 JPQL을 사용하게되면 무조건 플러시가 호출되어 DB처리를 해주고 값을 가져오게끔 해준다.

 

플러시 모드 옵션

- 손대지않으면 디폴트값인 AUTO가 적용되는데 손대지않고 그냥 AUTO로 사용할 것을 권장

em.setFlushMode(FlushModeType.COMMIT)

- FlushModeType.AUTO : 커밋이나 쿼리를 실행할 때 플러시 (기본값)

- FlushModeType.COMMIT : 커밋할 때만 플러시

 

 

인강으로 공부하면서 작성하는 글로 잘못된 정보가 있을 수도 있습니다! 잘못된 정보가 있을 시 댓글달아주세요 : 0

반응형