관리 메뉴

공부 기록장 💻

[Spring/JPA] 영속성 컨텍스트의 flush란? 본문

# Tech Studies/Java Spring • Boot

[Spring/JPA] 영속성 컨텍스트의 flush란?

dream_for 2023. 4. 24. 17:28

자바 ORM 표준 JPA 프로그래밍 - 기본편(인프런) 참고

 


Flush란?

플러시란, 영속성 컨텍스트의 변경 내용(Insert, Update, Delete 등)을 데이터베이스에 반영하는 것을 말한다.

 

 

Flush 발생한 경우에는,

1) 변경을 감지하고

2) 수정된 엔티티를 쓰기 지연 SQL 저장소에 등록하고,

3) 쓰기 지연 SQL 저장소의 쿼리들을 데이터베이스에 전송하게 된다.

 

 

 

Flush를 수행하는 방법들

 

em.persist(memberA);
em.persist(memberB);
em.persist(memberC);

// JPQL 실행
query = em.createQuery("select m from Member m", Member.class);
List<Member> members = query.getResultList(); // 결과 없음

 

1. em.flush() - 직접 호출

트랜잭션의 commit이 수행되기 전 직접 호출하여 쓰기 지연 SQL 저장소의 쿼리들을 DB에 적용할 수 있다.

 

2. transaction.commit() - flush 자동 호출

 

3. JPQL 쿼리 실행 - flush 자동 호출

JPQL 쿼리 실행 시에는 flush를 자동적으로 호출한다. 

다만 아래와 같이 플러시 모드 옵션 지정을 하여 commit이 실행될 때만 DB에 적용되도록 할 수도 있다.

 

em.setFlushMode(FlushModeType.COMMIT);

// FlushModeType.AUTO : 커밋이나 쿼리 실행할 때 플러시 (기본값)
// FlushModeType.COMMIT : 커밋을 수행할 때만 플러시

 

 

Flush 의 특징

 

1) 영속성 컨텍스트를 비우지 않는다.

쓰기 지연 SQL 저장소에 있는 쿼리들을 DB에 반영하는 업무만 수행함!

 

2) 영속성 컨텍스트의 변경 내용을 DB에 동기화한다.

 

3) 트랜잭션이라는 작업 단위가 중요하다. 커밋 직전에만 동기화하면 됨!

 

728x90
반응형
Comments