삽질 주도 개발
article thumbnail
Published 2022. 11. 19. 01:30
JPA flush Spring

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