플러시 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
'JPA' 카테고리의 다른 글
[JPA] @Column / @Enumerated 속성 (0) | 2021.07.02 |
---|---|
[JPA] @Entity / @Table 매핑 어노테이션 정리 (0) | 2021.07.01 |
[JPA] 영속성 컨텍스트 PersistenceContext (4) | 2021.06.29 |
[JPA] JPQL / 페이징 처리 (0) | 2021.06.28 |
[JPA] DB 저장, 조회, 삭제, 수정하기 DB CRUD (4) | 2021.06.25 |