JPA

[JPA] 플러시란?

수수한개발자 2022. 6. 13.
728x90

플러시란?

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

 

  • 데이터베이스가 커밋될때 플러시라는게 일어납니다.
  • insert sql이나 delete sql이나 update sql이 DB에 날라가는것을 의미합니다.
  • 영속성 컨텍스트의 변경사항을 DB에 날려주는것을 의미합니다.

플러시 발생 

플러시 발생하면 무슨일이 생길까요? 다음 3가지 일이 벌어집니다.

1. 변경감지

2.수정된 엔티티 쓰기 지연 SQL저장소에 등록

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

 

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

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

 

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

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

em.persist(memberA);

em.persist(memberB);

em.persist(memberC);

멤버 A,B,C 를 저장 해놓은 상태에서는 DB에 쿼리가  안날라간다. 

중간에 JPQL을 실행한다고 가정하자.

query = em.createQuery("select m from Member m " ,Member.class);

List<Member> members = query.getResultList();

를하면 insert 쿼리가 안나갔으니 당연히 member를 조회하면 아무것도 안나온다. 이런 문제를 방지 하고자 jpa는 JPQL 쿼리를 실행할때는 기본모드가 플러시를 날려버린다. 그리고 쿼리가 날라간다.

 

 

플러시 모드 옵션

em.setFlushMode(FlushModeType.COMMIT)

FlushModeType.AUTO

커밀이나 쿼리를 실행할 때 플러시 (기본값)

플러시를 하고 커밋한다.

FlushModeType.COMMIT

커밋할 때만 플러시

(쓸일이 거의 없다고 한다...!)

 

마지막으로 플러시에 대해 정리하고 끝내겠습니다..!

 

플러시는 !

영속성 컨텍스트를 비우지않음

영속성 컨텍스트의 변경내용을 데이터베이스에 동기화한다.

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

728x90

'JPA' 카테고리의 다른 글

[JPA] 양방향 연관관계와 연관관계의 주인  (0) 2022.06.15
[JPA] 필드와 컬럼 매핑  (0) 2022.06.14
[JPA] 영속성 컨텍스트  (0) 2022.05.11
[JPA] 단방향 연관관계  (0) 2022.05.09
[JPA]기본 키 매핑  (0) 2022.05.08

댓글