해당 수업은 김영한님의 JPA 수업을 통해 작성되었으며 약간의 저의 생각이나 추가적으로 제가 궁금했던 내용을 더 적었다는 사실을 밝힙니다.
💡 플러시(flush)
영속성 컨텍스트의 변경 내용을 DB에 반영하는 작업이다.
플러시 발생한다면
- Dirty Checking 변경 감지를 한다
- 수정된 엔티티 쓰기 지연 SQL 저장소에 등록한다
- 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송한다.
영속성 컨텍스트를 플러시하는 방법
- em.flush() - 직접 작성을 통해 호출한다
만약 이렇게 작성하게 된다면 System.out.println이 반영되기 이전에 현재 쓰기 지연 SQL 저장소에 있는 내용들이 DB에 반영이 된다.
하지만 쓰기 지연 SQL 저장소에 있는 쿼리문이 사라지진않는다.
- 트랜잭션 커밋 - commit 을 하면 자동으로 flush가 호출된다
- JPQL 쿼리 실행 - 이또한 flush가 자동으로 호출된다.
em.persist(memberA);
em.persist(memberB);
em.persist(memberC);
query = em.createQuery("select m from Member m", Member.class);
List<Member> members = query.getResultList();
이러한 경우를 보면 쿼리가 실행되면 flush가 바로 실행된다. 그래서 위에 persist또한 flush로 인해 DB에 접근된다.
결론
- 영속성 컨텍스트를 비우지 않는다.
- 영속성 컨텍스트의 변경 내용을 데이터 베이스에 동기화한다
- 트랜잭션이라는 작업 단위가 중요하다 ☞ 커밋 직전에만 동기화 하면 된다.
'Spring > 🌵 JPA' 카테고리의 다른 글
🌵 JPA의 영속성(feat.준영속상태) (0) | 2023.09.18 |
---|---|
🌵 JPA의 구동 방식과 코드 (0) | 2023.09.18 |
🌵 JPA(feat. ORM) (0) | 2023.09.16 |