Development Memories/JPA

【JPA】플러시(Flush)

친절한올드보이 2021. 5. 4. 14:32
반응형

JPA의 플러시(flush)에 대해서 공부한 내용을 정리해 알아보겠습니다.

(기본 내용 출처는 자바 ORM 표준 JPA 프로그래밍 책 입니다.)

 

플러시는 영속성 컨텍스트의 변경 내용을 데이터베이스에 적용하는 작업을 말합니다.

 

플러시를 실행하게 되면 아래와 같은 작업이 발생하게 되는데, 

  1. 영속성 컨텍스트에 있는 모든 엔티티를 스냅샷과 비교해서 변경된 엔티티를 찾아 내서 수정 쿼리를 만들어 쓰기 지연 SQL저장소에 등록하게 됩니다.
  2. 쓰기 지연 SQL 저장소의 쿼리를 데이터 베이스에 전송하여 적용 합니다.

flush() 부분 참고해주세요.(출처: 직접 작성)

 

 

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

  1. em.flush()를 직접 호출
    1. 영속성 컨텍스트를 강제로 플러시 하는 방법으로 테스트나 다른 JPA를 함께 사용할때를 제외하고는 사용하지 않는 것이 좋습니다. 수동으로 처리하기 보다는 자동적으로 처리 되도록 맡기는 것이 좋습니다.
  2. 트랜젝션 커밋시 플러시가 자동 호출
    1. 트랜젝션만 커밋하게 되면 DB에 어떠한 데이터도 반영이 되지 않습니다. 그렇기 때문에 트랜잭션을 커밋하기 전에 반드시 플러시를 해 주어야 하는데, 깜빡하고 플러시 실행을 잊는 문제를 방지하기 위해 자동으로 플러시를 호출해 줍니다.
  3. JPQL 쿼리 실행시 플러시가 자동 호출
    1. JPQL(JPA의 네이티브 쿼리) 와 같은 캑체지향 쿼리를 호출할 때도 플러시가 실행 됩니다. 아래 예제를 통해 간략히 보겠습니다.
jpa.persist(memberA);
jpa.persist(memberB);
jpa.persist(memberC);

query = jpa.createQuery("select m from Member m", Memeber.class);
List<Member> members = query.getResultList();

<예제 코드>

 

3-1-1. jpa.persist를 호출해서 각 memberA ~ C 오브젝트를 영속성 컨텍스트에 주입 함.

 

3-1-2. JPQL을 쿼리로 데이터 베이스에 있는 각 멤버의 데이터를 조회 함. 그러나 데이터는 영속성 컨텍스트에 있는 상태로 아직 DB에 적용되지 않은 상태로 조회가 않됨.

 

3-1-3. 쿼리 실행전에 플러시를 실행해서 변경 사항을 DB에 적용해야 해야만 데이터가 조회 됨.

 

3-1-4.3-1-2.」 과 3-1-3.」 문제 발생을 예방하기 위해 JPQL 실행시 자동으로 플러시 호출해서 실행해 줌.

(참고로 식별자를 기준으로 조회하는 find() 메소드의 경우는 플러시가 자동으로 실행되지 않기에 주의해야 합니다.)

 

 

▶ 플러시 모드 옵션

 

엔티티 메니저에 플러시 모드를 직접 지정할 수 있습니다. 「persistence.xml」 에 「FlushModeType」을 사용하면 됩니다.

  • FlushModeType.AUTO
    • 커밋이나 쿼리를 실행할 때 플러시 동작을 설정합니다.(기본값: 자동)
  • FlushModeType.COMMIT
    • 커밋 할때만 자동으로 플러시

 

책에 쓰여진 내용을 그대로 인용하여 적었습니다.

플러시라는 이름으로 인해 영속성 컨텍스트에 보관된 엔티티를 지운다고 생각하면 안 된다. 다시한번 강조하지만 영속성 컨텍스트의 변경 내용을 데이터 베이스에 동기화하는 것이 플러시 이다.