BackEnd/ORM(JPA)

플러시 (Flush)

플러시란?

영속성 컨텍스트의 변경내용을 데이터베이스에 반영

 

플러시가 발생하는 경우

  • 변경 감지
  • 수정된 엔티티 쓰기 지연 SQL 저장소에 등록
  • 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송 (등록, 수정, 삭제 쿼리)

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

  • em.flush() - 직접 호출
  • 트랜잭션 커밋 - 플러시 자동 호출
  • JPQL 쿼리 실행 - 플러시 자동 호출

JPQL 쿼리 실행시 플러시가 자동으로 호출되는 이유

em.persist(memberA);
em.persist(memberB);
em.persist(memberC);
// tx.commit or em.flush()전까지는 DB에 안날라감

// 중간에 JPQL 실행
// JPQL 실행시 persist해놓은 객체들이 DB에 반영되지 않으면
// 아래 쿼리는 동작하지 않음
// 그런 사태를 방지하고자 flush가 자동으로 호출되게 설정되어 있음
query = em.createQuery("select m from Member m", Member.class);
List<Member> members = query.getResultList();

 

플러시 모드 옵션

em.setFlushMode(FlushModeType.COMMIT)
  • FlushModeType.AUTO
    • 커밋이나 쿼리를 실행할 때 플러시 (기본값)
  • FlushModeType.COMMIT
    • 커밋할 때만 플러시

 

플러시는 이렇다

  • 영속성 컨텍스트를 비우지 않음
  • 영속성 컨텍스트의 변경내용을 데이터베이스에 동기화
  • 트랜잭션이라는 작업 단위가 중요 -> 커밋 직전에만 동기화 하면 됨

'BackEnd > ORM(JPA)' 카테고리의 다른 글

엔티티 매핑  (0) 2022.12.29
준영속 상태 (Detached)  (0) 2022.12.29
영속성 컨텍스트 (persistence Context)  (0) 2022.12.28
JPA 구동방식 및 CRUD  (0) 2022.12.28
JPA 개요  (0) 2022.12.28