영속성 관리 - 플러시(Flush)

김득회·2022년 6월 6일
0

JPA

목록 보기
6/11

Flush란?

JPA를 사용할 때 쓰기 지연 SQL 저장소에 있는 내용을 DB에 반영하기 위해 사용하는 메서드
플러시의 역할은 영속성 컨텍스트의 변경 내용을 데이터베이스와 동기화 하기위해 사용한다.

Flush가 실행되면 일어나는 일

  1. 변경 감지가 동작하여 영속성 컨텍스트에 있는 모든 엔티티를 스냅샷과 비교 -> 수정 엔티티를 찾는다.
  2. 수정된 엔티티 발견 시 수정 쿼리를 만들어서 쓰기 지연 SQL 저장소에 등록한다.
  3. 쓰기 지연 SQL 저장소의 쿼리를 DB에 전송한다. (Create, Update, Delete)

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

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

직접호출

엔티티 매니저 내부 메서드를 사용하여 flush()를 호출하는 방식이다. 직접 호출해서 영속성 컨텍스트를 강제 플러시하는 방법이다. 해당 방법은 테스트나, 다른 프레임워크와 JPA를 함께 사용하는 것을 제외하고는 거의 사용하지 않는 방식이다.

트랜잭션 커밋

flush()를 사용하는 이유는 위에서도 설명했지만 SQL을 만들어서 DB에 전달하는 역할을 수행한다.
때문에 플러시를 하지않고 커밋을 하게되면 SQL없이 커밋이되는 것이기 때문에 아무것도 반영이 되지 않는다.
그래서 커밋 전에 반드시 영속성 컨텍스트의 정보를 플러시를 호출해서 전달해야한다.
JPA에서는 사용자가 플러시를 하지 않을 것을 예방하기 위해 자동으로 플러시를 호출한다.

JPQL 쿼리 실행

쓰기 지연 SQL 저장소에 저장하고 플러시를 하지 않은 상태에서 JPQL을 사용하여 엔티티를 조회하면 당연히 데이터가 나오지 않을 것이다. 때문에 JPQL로 쿼리를 실행하기 직전에 JPA에는 플러시를 우선 자동 호출을 하여 DB에 영속성 컨텍스트에서 관리하고 있는 내용을 반영한다.
다만, find를 사용하는 식별자를 사용한 검색에서는 플러시가 수행되지 않는다.

플러시 모드 (Option)

엔티티 매니저의 플러시 옵션을 지정하려면 javax.persistence.FlushModeType을 사용하면 된다.

옵션

  • FlushModeType.AUTO : 커밋이나 쿼리를 실행할 때 플러시 (기본값)
  • FlushModeType.COMMIT : 커밋할 때만 플러시
em.setFlushMode(FlushModeType.COMMIT); //플러시 모드 직접 설정

주의사항

플러시를 사용한다고 하여 영속성 컨텍스트의 정보 (1차 캐시)가 제거가 되는 것은 아니다.
플러시는 SQL을 DB에 전달하는 것 뿐이다.

profile
감성 프로그래머 HoduDeuk

0개의 댓글