인프런 커뮤니티 질문&답변

정민교님의 프로필 이미지
정민교

작성한 질문수

자바 ORM 표준 JPA 프로그래밍 - 기본편

준영속 상태

jpql과 1차 캐시

작성

·

159

0

Persist를 실행할 때는 영속성 컨텍스트 1차 캐시에 데이터를 넣지 않는 건가요? 아니면 persist도 1차 캐시에 데이터와 스냅샷 모두 저장하나요?Find를 실행해서 db에서 가져올 때만 가져올 때의 엔티키 상태를 스냅샷을 찍고 엔티티와 함께 1차 캐시에 저장하나요?jpql 실행시에는 1차 캐시를 조회하지 않는 건가요?이 질문의 이유:Find는 1차 캐시에 있는 엔티티를 먼저 조회하는 것으로 알고 있습니다.jpql을 실행할 때 Member 데이터가 없으면 안된다고 설명하고 있습니다그래서 jpql 실행은 1차 캐시를 먼저 찾지 않고 바로 쿼리를 전송하는 것인가? 라는 생각이 들었습니다.jpql이 1차 캐시를 조회하지 않으면 persist 호출 시 1차 캐시에 엔티티를 저장해도 db에서 찾으니까 결국 flush가 발생한다는 생각이 맞아 떨어지는 것 같습니다.

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.

정민교님의 질문에 대한 답변은 다음과 같습니다.

  1. persist 메소드를 실행할 때 영속성 컨텍스트의 1차 캐시에 엔티티가 저장됩니다. 저장하는 과정에서 엔티티의 상태가 스냅샷으로 기록되어 변경 감지(Dirty Checking)에 사용됩니다.

  2. find 메소드를 사용해서 데이터베이스에서 엔티티를 가져올 때, 해당 엔티티가 1차 캐시에 없다면 데이터베이스에서 조회한 후 엔티티를 1차 캐시에 저장하며, 이때의 엔티티 상태가 스냅샷으로 기록됩니다.

  3. JPQL을 실행할 때, JPQL은 기본적으로 1차 캐시를 확인하지 않고, 바로 쿼리를 데이터베이스로 전송합니다. 하지만, JPQL 실행 전 플러시(Flush)가 발생해 영속성 컨텍스트의 변경 내용이 데이터베이스에 반영되기 때문에, JPQL 쿼리 결과와 영속성 컨텍스트의 상태가 동기화됩니다.

그러므로, persist 호출 시 저장된 엔티티가 JPQL로 조회되지 않는 것은 아닙니다. JPQL 실행 전에 발생하는 플러시로 인해, 영속성 컨텍스트에 있는 변경 내용이 데이터베이스에 반영되므로 JPQL 쿼리 결과에 영향을 줄 수 있습니다.

답변이 정민교님의 질문에 도움이 되었길 바랍니다.

정민교님의 프로필 이미지
정민교

작성한 질문수

질문하기