JPA(Java Persistence Api)에서 영속성 컨텍스트와 실제 DB 간의 동기화하기 위한 flush에 대해 이해해보자.
flush
영속성 컨텍스트의 변경 내용을 DB에 반영하는 것을 말한다.
일반적으로 transaction.commit()
을 호출하게 되면 내부적으로 flush()를 호출하게 된다.
flush라는 이름이 느낌이 뭔가 다 비우는 것 같지만, 1차 캐시는 비워지지 않는다
그 외에 영속성 컨텍스트를 바로 플러시하는 방법은 다음과 같다.
em.flush()
Member member = new Member("silly");
em.persist(member);
em.flush(); // 쿼리가 실행되어 DB에 반영
transaction.commit(); // commit
jpql 쿼리 실행시점
jpql은 JPQL(Java Persistence Query Language) 는 JPA의 일부로 정의된 플랫폼 독립적인 객체지향(객체 참조가 가능한) 쿼리 언어이다. 그리고 JPQL은 SQL로 번역이 돼서 실행된다. (실행된다는 것을 이해해야 한다)
transaction.begin();
em.persist(memberA);
em.persist(memberB);
em.persist(memberC);
em.createQuery("select m from Member as m", Member.class);
transaction.commit();
commit()을 호출하기 전까지 insert query는 실행되지 않은 상태이다.
이 상태에서 JPQL로 DB에서 가져오는 select query를 실행한다면 아직 데이터가 없기 때문에 조회할 수 없다.
이 때문에 JPA의 기본 모드는 JPQL 쿼리 실행 시 flush()를 자동으로 호출한다.
Reference
자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의
JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., - 강의 소개 | 인프런
www.inflearn.com
'Spring' 카테고리의 다른 글
JPA 연관 관계 매핑 기초 (0) | 2022.11.20 |
---|---|
spring boot 2.5 이후 DB 데이터 초기화 설정 변경 사항 (0) | 2022.11.19 |
엔티티 매핑 (0) | 2022.11.18 |
영속성 컨텍스트 (0) | 2022.11.18 |
Spring 환경별 profile 분리 (0) | 2022.11.17 |