개발자 취업준비/DataBase JPA

플러시

naspeciallist 2025. 5. 4. 23:50

 

1. 플러시란?


 

 

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

데이터베이스가 커밋이 될 때 플러시가 자동으로 호출이 됩니다. 그러면 플러시가 발생할 때 다음과 같은 일들이 발생합니다.

  1. 변경감지
  2. 수정된 엔티티 쓰기 지연 SQL 저장소에 등록
  3. 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송(등록,수정,삭제 쿼리)

영속성 컨텍스트를 플러시 하는 방법에는 다음과 같은 방법이 있습니다.

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

예를 들어서 다음과 같은 코드를 구성해보겠습니다.

 

try{
	//영속
	Member member = new Member(200L,"member200")
	em.persist(member);
	
	System.out.println("==========")
	tx.commit();
} catch (Exception e) {
	tx.rollback();
	}

 

새로운 멤버 객체를 만든 뒤 member엔티티에 저장을 하는 코드를 구성하였습니다. 여기서 멤버가 저장되는 insert쿼리는 트랜잭션이 커밋한 시점에서 실행이 되게 됩니다. 하지만 만약에 내가 미리 데이터 베이스에 반영을 하거나 쿼리를 미리 보고 싶을 때는 em.flush()라는 걸 강제로 호출하면 됩니다.

 

try{
	//영속
	Member member = new Member(200L,"member200")
	em.persist(member);
	em.flush();
	System.out.println("==========")
	tx.commit();
} catch (Exception e) {
	tx.rollback();
	}

이렇게 하면 이제 데이터베이스에 인서트 쿼리가 em.flush()한 시점에 바로 실행이 되고 그 다음에 커밋이 실행되게 됩니다.

 

// flush()호출 전 결과 값
==========
insert쿼리 실행

// flush() 호출 후 결과 값
insert쿼리 실행
==========

 

이처럼 flush()를 강제호출하게 되면 변경감지와 쓰기 지연 SQL저장소에 있던 쿼리문들이 데이터베이스에 반영이 됩니다. 하지만 기존 커밋과 다르게 1차캐시의 값은 그대로 유지가 됩니다.

 

 

2. JPQL 쿼리 실행시 플러시가 자동으로 호출


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();

 

위와 같이 코드를 구성을 해보았습니다. em.persist를 이용해서 값을 저장했을 때는 insert쿼리가 실행이 되지 않게 됩니다. 하지만 여기서 중간에 JPQL을 실행시키게 되면 자동으로 flush()가 호출되어 insert 쿼리가 데이터베이스에 반영이 되게 됩니다. 이렇게 JPQL이 실행될 때 flush()가 자동으로 호출이 되는 이유는 JPQL구문을 실행시키기 위해서 입니다. JPQL 구문이 실행 될 때는 SQL로 번역이 돼서 실행이 되게 됩니다. 하지만 만약에 JPQL구문이 실행을 시켰는데 이전에 작성했던 메서드들의 결과값이 데이터베이스에 반영되지 않아 JPQL이 제대로 실행이 되지 않는다면 문제가 발생하게 됩니다. 이러한 문제를 미리 막기 위해서 JPQL이 실행될 때 자동으로 flush()를 호출하여 데이터베이스에 제대로 반영된 값에서 JPQL구문을 실행시킬 수 있게 되는 겁니다.

 

 

정리하자면 flush()는 다음과 같은 특징을 가지고 있습니다.

  1. 영속성 컨텍스트를 비우지 않음
  2. 영속성 컨텍스트의 변경내용을 데이터베이스에 동기화
  3. 트랜잭션이라는 작업 단위가 중요 → 커밋 직전에만 동기화 하면 됨

'개발자 취업준비 > DataBase JPA' 카테고리의 다른 글

엔티티 매핑  (0) 2025.05.06
준영속 상태  (0) 2025.05.05
영속성 컨텍스트  (0) 2025.05.01
JPA 이해하기  (0) 2025.05.01
객체 CRUD  (0) 2025.05.01