상세 컨텐츠

본문 제목

[JPA/Hibernate] Flush란?

JPA

by 코코코차 2024. 5. 30. 16:48

본문

728x90

flush 란?

- 영속성 컨텍스트의 변경 내용을 데이터베이스에 동기화 하는 작업인데 이때 등록, 수정, 삭제한 엔티티를 데이터베이스에 반영한다.

 


그럼 flush는 언제 호출될까?

1.  직접 호출 / flush()

 

2. 트랜잭션 커밋 및 프로시 자동 호출 / commit()

여기서 commit 과 flush의 차이를 알아야 할것같다.

flush는 단순히 지연SQL저장소에 모인 쿼리를 데이터베이스에 보내는 것이고, 

 

commit은 그것과 더불어서 commit을 하는것이다.

 

commit이라는 것은 "commit문"의 깃발을 꽂는다고 생각하면 된다. "이게 내가 한거야!!" 하면서 단계를 표시해두는 역할도 한다는 말임

 

따라서 commit() = flush + commit 인거다!!

 

3. JPQL 쿼리 실행시 자동 호출

JPQL이란

  • JPA는 복잡한 조건을 사용해서 엔티티 객체를 조회할 수 있는 다양한 쿼리 기술을 지원한다. 다양한 객체지향 쿼리 중 하나
  • 엔티티 객체를 조회하는 객체지향 쿼리다. 테이블을 대상으로 쿼리하는 것이 아니라 엔티티 객체를 대상으로 쿼리한다.

 

만약 엔티티를 생성하고 그것을 영속 상태로 만들었다.


영속상태인 엔티티들은 flush되기 전에는 데이터베이스에 반영되지 않는다.

 

이상태에서 만약 직접 데이터베이스에 쿼리를 날리는 JPQL을 실행하면 영속상태인 엔티티는 반영이 되어있지 않아 조회가 되지 않는다. 

 

JPA는 이런 문제를 예방하기 위해서 JPQL을 실행할 때도 플러쉬를 자동 호출 한다.


플러시 모드

그럼 이런 플러시를 자동으로 해주는것 말고 내가 손수 하고 싶다면?

엔티티 매니저의 javax.persistence.FlushModeType을 사용해서 플러시 모드를 직접 지정하면 된다.

  • 기본인 플러시 모드(커밋,쿼리 실행 시): FlushModeType.AUTO
  • 커밋할때만 플러시 하는 플러시 모드: FlushModeType.COMMIT

 

 

 

 

 

 

참고자료: 김영한. [자바 ORM표준 JPA 프로그래밍],2015

 

728x90
반응형

관련글 더보기