📂 플러시
플러시( flush() )는 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영한다. 플러시를 실행하면 구체적으로 다음과 같은 일이 일어난다.
- 변경 감지가 동작해서 영속성 컨텍스트에 있는 모든 엔티티를 스냅샷과 비교해 수정된 엔티티를 찾는다. 수정된 엔티티는 수정 쿼리가 만들어 쓰기 지연 SQL 저장소에 등록한다.
- 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송한다.(등록, 수정, 삭제 쿼리)
📂 플러시 호출 방법
영속성 컨텍스트를 플러시하는 방법은 아래의 3가지이다.
- em.flush() 를 직접 호출
- 트랜잭션 커밋 시 플러시가 자동 호출
- JPQL 쿼리 실행 시 플러시가 자동 호출
하나씩 살펴보자.
1️⃣ 직접 호출( em.flush() )
엔티티 매니저의 flush() 메소드를 직접 호출해서 영속성 컨텍스트를 강제로 플러시하는 방법이다. 테스트나 다른 프레임워크와 JPA를 함께 사용할 때를 제외하고 거의 사용하지 않는다.
2️⃣ 트랜잭션 커밋 시
데이터베이스에 변경 내용을 SQL로 전달하지 않고 트랜잭션만 커밋하면 어떤 데이터도 데이터베이스에 반영되지 않는다. 따라서 커밋 전에 꼭 플러시를 호출해 변경 내용을 데이터베이스에 반영해야 한다.
JPA는 이런 문제를 예방하기 위해서 트랜잭션을 커밋할 때 플러시를 자동으로 호출한다.
3️⃣ JPQL 쿼리 실행 시
JPQL이나 Criteria 같은 객체지향 쿼리를 호출할 때도 플러시가 실행된다.
그 이유를 다음 코드와 함께 살펴보자.
- 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()를 통해 엔티티들을 영속 상태로 만들었다. 이 엔티티들은 아직 데이터베이스에 반영되지 않았다. 이때 JPQL을 실행하면 어떻게 될까? JPQL은 SQL로 변환되어 데이터베이스에서 엔티티를 조회한다. 하지만 아직 엔티티들은 데이터베이스에 없기 때문에 쿼리 결과로 반환되지 않는다.
따라서 쿼리를 실행하기 직전에 영속성 컨텍스트를 플러시해서 변경 내용을 데이터베이스에 반영해야 한다. JPA는 이러한 문제를 예방하기 위해 JPQL을 실행할 때도 플러시를 자동 호출한다. 따라서 memberA, memberB, memberC도 쿼리 결과에 포함된다.
참고) find() 메소드를 호출할 때는 플러시가 실행되지 않는다.
📂 플러시 모드 옵션
엔티티 매니저에 플러시 모드를 직접 지정하려면 javax.persistence.FlushModeType 을 사용하면 된다.
- FlushModeType.AUTO : 커밋이나 쿼리를 실행할 때 플러시(Default)
- FlushModeType.COMMIT : 커밋할 때만 플러시
플러시 모드를 별도로 지정하지 않으면 AUTO로 동작한다. COMMIT 모드는 성능의 최적화를 위해 사용할 수 있는데 자세한 내용은 뒤에서 알아보자.
// 플러시 모드 직접 설정
em.setFlushMode(FlushModeType.COMMIT);
중요
플러시는 영속성 컨텍스트에 보관된 엔티티를 지우는 것이 아니다. 영속성 컨텍스트의 변경 내용을 데이터베이스에 동기화하는 것이다.
데이터베이스와 동기화를 최대한 늦추는 것이 가능한 이유는 트랜잭션이라는 작업 단위가 있기 때문이다. 트랜잭션 커밋 직전에만 변경 내용을 데이터베이스에 보내 동기화하면 된다.
참고
자바 ORM 표준 JPA 프로그래밍(김영한 저)
'스프링(Spring) > JPA' 카테고리의 다른 글
[JPA] 엔티티 매핑(1) - @Entity @Table (0) | 2023.04.27 |
---|---|
[JPA] 준영속 (0) | 2023.04.27 |
[JPA] 영속성 컨텍스트의 특징 (1) | 2023.04.17 |
[JPA] 영속성 관리 - 엔티티 매니저/팩토리, 영속성 컨텍스트, 엔티티 생명주기 (0) | 2023.04.15 |
[JPA] 엔티티 매니저 설정 + 트랜잭션 관리 + 비즈니스 로직 (2) | 2023.04.14 |