답변 1
18
안녕하세요. 충만님
질문하신 것 처럼 JPQL은 1차 캐시를 먼저 조회하지 않습니다. JPQL을 실행하면 항상 1차 캐시를 무시하고, 데이터베이스에 직접 SQL을 실행합니다.
그리고 실행 결과를 1차 캐시에 보관하고, 최종적으로 1차 캐시에 보관된 결과를 반환합니다.
이런 방식으로 동작하는 이유는 em.find(식별자) 처럼 단순하게 식별자를 조회하는 경우는 1차 캐시에 있는지 없는지 판별하기가 쉬운데, JPQL은 광범위하게 데이터를 찾기 때문에 이런 방식의 구현이 어렵습니다. 그래서 우선 데이터베이스에서 조회부터 하는 것이지요.
추가로 JPQL을 실행해서, 데이터베이스에서 결과를 가져 왔는데, 이미 1차 캐시에 동일한 식별자를 가진 엔티티가 있으면, 데이터베이스에서 가져온 엔티티를 버리고 1차 캐시에 있는 엔티티를 유지합니다. 이런방식 덕분에 JPQL을 사용해도 엔티티 동일성을 유지합니다.
궁금하신 내용이 있으면 언제든지 편하게 질문 주세요^^ 고맙습니다.