본문 바로가기
JPA/JPA원리

4 JPA 플러시(flush)

by 킹차니 2021. 7. 3.
김영한님의 인프런 강의와 PDF를 바탕으로 정리하였습니다.
https://www.inflearn.com/courses?s=%EA%B9%80%EC%98%81%ED%95%9C

 

플러시 

영속성 컨텍스트의 변경 내용을 데이터베이스에 반영하는 것입니다.

 

플러시가 발생하는 순서는 아래와 같습니다.

1. 변경 감지 (dirty checking)
2. 수정된 엔티티 '쓰기 지연 SQL 저장소'에 등록

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

 

영속성 컨텍스트를 플러시하는 방법은 3가지가 있습니다.

1. em.flush() (직접 호출)
2. 트랜잭션 커밋 (플러시 자동 호출)

3. JPQL 쿼리 실행 (플러시 자동 호출)

 

 

이제 위의 3가지 방법으로 영속성 컨텍스트를 flush해보겠습니다.

 

 

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

코드로 보면 아래와 같이 flush를 직접 호출할 수 있습니다. (주석 참고)

 

 

2. 트랜잭션 커밋 (플러시 자동 호출)

tx.commit()을 하면 쓰기 지연 SQL 저장소에 저장해준 SQL문들이 나갑니다. 이는 이전에 계속 사용한 방법이므로 코드는 생략합니다.

 

 

 

3. JPQL 쿼리 실행 (플러시 자동 호출)

또한 플러시가 자동 호출되는 경우는 아래와 같습니다. ( JPQL 쿼리 실행을 예로 들면 )

위처럼  memberA, memberB, memberC를 commit전(DB에 insert되기 전)에 JPQL로 select문을 날리면 아직 저장되지 않는 엔티티들에 대한 쿼리가 실행될 수 있으므로 이는 문제가 될 수 있습니다. 하여 JPQL문이 수행되기 전에 자동으로 flush가 호출됩니다.