jpql과 1차 캐시
258
작성한 질문수 50
Persist를 실행할 때는 영속성 컨텍스트 1차 캐시에 데이터를 넣지 않는 건가요? 아니면 persist도 1차 캐시에 데이터와 스냅샷 모두 저장하나요?Find를 실행해서 db에서 가져올 때만 가져올 때의 엔티키 상태를 스냅샷을 찍고 엔티티와 함께 1차 캐시에 저장하나요?jpql 실행시에는 1차 캐시를 조회하지 않는 건가요?이 질문의 이유:Find는 1차 캐시에 있는 엔티티를 먼저 조회하는 것으로 알고 있습니다.jpql을 실행할 때 Member 데이터가 없으면 안된다고 설명하고 있습니다그래서 jpql 실행은 1차 캐시를 먼저 찾지 않고 바로 쿼리를 전송하는 것인가? 라는 생각이 들었습니다.jpql이 1차 캐시를 조회하지 않으면 persist 호출 시 1차 캐시에 엔티티를 저장해도 db에서 찾으니까 결국 flush가 발생한다는 생각이 맞아 떨어지는 것 같습니다.
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
정민교님의 질문에 대한 답변은 다음과 같습니다.
persist메소드를 실행할 때 영속성 컨텍스트의 1차 캐시에 엔티티가 저장됩니다. 저장하는 과정에서 엔티티의 상태가 스냅샷으로 기록되어 변경 감지(Dirty Checking)에 사용됩니다.find메소드를 사용해서 데이터베이스에서 엔티티를 가져올 때, 해당 엔티티가 1차 캐시에 없다면 데이터베이스에서 조회한 후 엔티티를 1차 캐시에 저장하며, 이때의 엔티티 상태가 스냅샷으로 기록됩니다.JPQL을 실행할 때, JPQL은 기본적으로 1차 캐시를 확인하지 않고, 바로 쿼리를 데이터베이스로 전송합니다. 하지만, JPQL 실행 전 플러시(Flush)가 발생해 영속성 컨텍스트의 변경 내용이 데이터베이스에 반영되기 때문에, JPQL 쿼리 결과와 영속성 컨텍스트의 상태가 동기화됩니다.
그러므로, persist 호출 시 저장된 엔티티가 JPQL로 조회되지 않는 것은 아닙니다. JPQL 실행 전에 발생하는 플러시로 인해, 영속성 컨텍스트에 있는 변경 내용이 데이터베이스에 반영되므로 JPQL 쿼리 결과에 영향을 줄 수 있습니다.
답변이 정민교님의 질문에 도움이 되었길 바랍니다.
벌크연산에서 member.getAge 호출 시 영속성 컨텍스트에서 데이터를 가져오는건가요?
0
33
2
inheritance startegy 선택시 고려사항
0
24
1
Entity 동등성 비교
0
25
1
실무 조언 관련 질문입니다.
0
48
1
H2데이터베이스 파일 생성
0
60
2
서브쿼리 강의에서 ALL 예시 관련 질문드립니다.
0
57
2
수정또는 삭제시 영속성 엔티티에 값이 무조건 있어야 하나요?
0
58
1
JPQL 메소드와 락
0
56
1
Delivery @OneToOne
0
64
1
17강 4~5분대 테이블 값 조회가 안됩니다.
0
98
2
UnsupportedOperationException 발생
0
89
3
H2 Database 연결이 안됩니다.
0
98
2
연관관계 매핑 질문드립니다.
0
88
2
h2데이터베이스 실행오류
0
110
2
persistence.xml
0
112
2
양방향 연관관계에서 연관관계의 주인(mappedBy)을 왜 꼭 정해야 하나요?
0
83
1
영속성 컨텍스트
0
70
1
JPA 프록시
0
100
1
Native Query와 MyBatis
0
74
1
영속성 컨텍스트는 어떤 메모리에 저장되는건가요?
0
93
1
임베디드 타입 예시 코드 관련 질문
0
121
3
명시적 조인에서 별칭을 주면 왜 객체에 접근할 수 있나요
0
97
3
인텔리제이 패키지 커서 단축키 질문
0
109
2
혹시 현재는 ID 데이터 타입이 String이면 안되나요?
0
149
1





