EntityManager를 사용해 작업을 수행해도 commit을 하기 전까지는 작업의 결과들이 DB에 반영되지 않는다고 했었다.

정확히는 "Flush가 호출되기 전에는 DB에 반영되지 않는다"가 맞다.

 

Flush가 호출되면 영속성 컨텍스트 안에 보관되고있던 이전 작업들에 대한 결과가 실제 DB에 반영이 된다.

(영속성 컨텍스트를 비우는 것이 아니라 영속성 컨텍스트의 변경내용을 DB에 적용시켜 주는 것이다)

 

영속성 컨텍스트를 Flush하는 방법은 세 가지가 존재한다.

(사실 실전에서 직접적으로 도움이 되는 내용은 아니지만 테스트 등에서 사용될 수 있다)

1. em.flush()

-> 그냥 직접 호출하는 것이다.

2. transaction.commit()

-> 트랜잭션 커밋을 수행하면 플러시가 자동으로 호출된다.

3. JPQL

-> JPQL 쿼리를 실행하면 플러시가 자동으로 호출된다.

-> JPQL은 SQL로 번역되어 DB에 바로 접근하게 된다. 이 경우에 만약 영속성 컨텍스트의 내용이 DB에 적용되지 않은 상태로 JPQL이 수행된다면 문제가 발생할 수 있으므로 JPQL 전에는 항상 flush를 먼저 수행한다.

 

 

 

영속성 컨텍스트의 생존 범위는 반드시 트랜잭션과 함께 동작하도록 해야 한다.

스프링 프레임워크를 사용하면 스프링에 의해 트랜잭션이 종료될 때 영속성 컨텍스트도 함께 종료되도록 동작한다.

'김영한님 스프링 강의 정리 > JPA' 카테고리의 다른 글

연관관계 매핑과 관계의 주인  (0) 2021.02.21
기본 키 매핑 전략 - IDENTITY, SEQUENCE  (0) 2021.02.21
Persistence Context 에 대해  (0) 2021.02.19
JPQL이란?  (0) 2021.02.19
ORM과 JPA란?  (0) 2021.02.19

+ Recent posts