반응형
JPA의 플러시(flush)에 대해서 공부한 내용을 정리해 알아보겠습니다.
(기본 내용 출처는 자바 ORM 표준 JPA 프로그래밍 책 입니다.)
플러시는 영속성 컨텍스트의 변경 내용을 데이터베이스에 적용하는 작업을 말합니다.
플러시를 실행하게 되면 아래와 같은 작업이 발생하게 되는데,
- 영속성 컨텍스트에 있는 모든 엔티티를 스냅샷과 비교해서 변경된 엔티티를 찾아 내서 수정 쿼리를 만들어 쓰기 지연 SQL저장소에 등록하게 됩니다.
- 쓰기 지연 SQL 저장소의 쿼리를 데이터 베이스에 전송하여 적용 합니다.
▶ 영속성 컨텍스트를 플러시하는 방법에는 3가지가 있는데
- em.flush()를 직접 호출
- 영속성 컨텍스트를 강제로 플러시 하는 방법으로 테스트나 다른 JPA를 함께 사용할때를 제외하고는 사용하지 않는 것이 좋습니다. 수동으로 처리하기 보다는 자동적으로 처리 되도록 맡기는 것이 좋습니다.
- 트랜젝션 커밋시 플러시가 자동 호출
- 트랜젝션만 커밋하게 되면 DB에 어떠한 데이터도 반영이 되지 않습니다. 그렇기 때문에 트랜잭션을 커밋하기 전에 반드시 플러시를 해 주어야 하는데, 깜빡하고 플러시 실행을 잊는 문제를 방지하기 위해 자동으로 플러시를 호출해 줍니다.
- JPQL 쿼리 실행시 플러시가 자동 호출
- 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
- 커밋 할때만 자동으로 플러시
책에 쓰여진 내용을 그대로 인용하여 적었습니다.
플러시라는 이름으로 인해 영속성 컨텍스트에 보관된 엔티티를 지운다고 생각하면 안 된다. 다시한번 강조하지만 영속성 컨텍스트의 변경 내용을 데이터 베이스에 동기화하는 것이 플러시 이다.
'Development Memories > JPA' 카테고리의 다른 글
【JPA】기본 키(Primary Key) 매핑 정리 (0) | 2021.05.18 |
---|---|
【JPA】엔티티 매핑(Entity Mapping) - @Entity, @Table (0) | 2021.05.06 |
【JPA】Persistence Context(영속성 컨텍스트) 란 무엇인가? (0) | 2021.04.15 |
【JPA】Persistence.xml 설정 방법 (0) | 2021.04.11 |