JPA/JPA 기본

8. 플러시

sdafdq 2023. 10. 20. 17:37

플러시란,

영속성 컨텍스트의 변경 내용을 DB에 반영하는 것,

즉 쿼리를 날리는 것 일듯.

 

 

플러시가 발생하면 일어나는 일

변경 감지

엔티티의 변경된 사항을 SQL로 번역하여 쓰기 지연 SQL 저장소에 등록

쓰기 지연 SQL 저장소에 있는 쿼리들을 DB에 날림.

 

아마 긴 문장으로 같이 전송하지 않을까..?

 

 

플러시 직접 쓸 일은 없는데 테스트 등 알아는 놔야 한다고 함.

 

em.flush() 이게 플러스 직접 호출

 

나머지 자동 호출임. 트랜잭션 commit 시점에.

JPQL 했을때도 자동호출이라는데 지금은 그냥 알아두기만 하라고 함..

 

 

플러시의 행동은, 위에 말했던 게 다임.

짧게 얘기하면, 그냥 변경감지 하고 변경된거 있으면 쓰기 지연 SQL 저장소에 들어가고,

쓰기 지연 SQL 저장소에 있는 쿼리들을 DB로 보내는 것.

 

이게 다임.

그리고, 플러시 한다고 commit 하는 건 아님.

EntityManager에서 가져온 transaction으로 commit해야 커밋임.

 

 

JPQL 날리면 flush 하도록 만든 이유는,

일단 SQL문이 뭘 날릴지도 모르고, 영속성 컨텍스트와 관계 없는 것 이기 때문에,

그냥 일단 지금까지의 상태들 다 반영 시킨 다음에 JPQL을 실행하려고.

 

플러시 모드를 설정할 수 있는데, 우리가 쓸 일은 없음.

em.setFlushMode(FlushModeType.COMMIT);

뭐 이런 식으로 하는 거임.

기본값은 AUTO임. commit 시점이나 쿼리 실행시

COMMIT은 커밋할 때만.

 

 

참고로, flush() 한다고 그것이 영속성 컨텍스트를 비우는 것은 아님.

하지만 당연히 쓰기 지연 SQL 저장소는 비운다.

 

 

'JPA > JPA 기본' 카테고리의 다른 글

10. 객체와 테이블의 매핑  (0) 2023.10.21
9. 준영속 상태  (0) 2023.10.20
7. 영속성 컨텍스트 2  (0) 2023.10.20
6. 영속성 컨텍스트  (0) 2023.10.20
5. 개발  (0) 2023.10.19