작성
·
570
0
자바 ORM 표준 JPA프로그램 듣고 넘어왔습니다.
이전 기본강의에서는 JPQL이 flush를 먼저 수행이 된후 JPQL쿼리가 동작한다고 배웠는데요.
이게 EntityManager의 일반적인 find() 메소드의 경우
clear()을 한 뒤 준영속상태에서 비로서 select쿼리가 나가는것으로 알고있습니다. (그렇지 않으면 1차 캐시에서 조회)
근데 JPQL의 경우 flush는 자동으로 호출 되지만 clear 즉, 1차캐시와 연관성이 있느냐 없느냐에 대해서 궁금증이 생겼습니다.
clear를 직접 해주지 않았음에도 불구하고 쿼리가 나가는 이유에 대해서 clear를 자동으로 해줘서 쿼리가 나가게 된것인지? 혹은 1차 캐시와 상관없이 자연쿼리가 나가게 되는것인지 한번 더 다잡고 가고싶습니다.
답변 감사히 기다리겠습니다.
답변 1
0
안녕하세요. kate님, 공식 서포터즈 y2gcoder입니다.
먼저 entityManager의 find()의 작동과정은 다음과 같습니다.
1차 캐시에서 해당 식별자를 가진 엔티티를 찾는다.
1차 캐시에 해당 식별자를 가진 엔티티가 있다면 그 엔티티를 반환한다.
1차 캐시에 해당 식별자를 가진 엔티티가 없다면 DB 조회하여 엔티티를 찾는다.
DB에서 조회해온 엔티티를 1차 캐시에 저장하고 해당 엔티티는 영속 상태가 된다.
flush()와 clear()는 아시는 것처럼 하는 역할이 다릅니다.
flush()는 영속성 컨텍스트의 변경 사항을 DB에 반영하게 됩니다. 이 과정에서 쓰기 지연 SQL 저장소에 있던 쓰기 쿼리들이 실제로 DB에 전송되는 것입니다.
clear()는 영속성 컨텍스트를 완전히 초기화해주는 메서드입니다. 영속성 컨텍스트를 초기화하고 나면 1차 캐시는 비워지고 모든 엔티티는 준영속 상태가 됩니다.
이를 JPQL과 비교해서 생각해보면 저희는 JPQL 직전 flush가 발생한다고 배웠습니다. flush가 발생한다는 말은 이전까지 있던 영속성 컨텍스트의 변경사항을 DB에 반영한다는 말로 이해할 수 있습니다. 그러므로 쿼리가 나가는 이유는 flush 때문으로 이해해주시면 될 것 같습니다.
감사합니다.
제가 질문드린 요점은 jpql이 DB에 Query를 날릴때 EntityManager의 find()와 같이 clear() 메소드(1차캐시)와 연관이 있느냐 없느냐 였습니다.
조금 더 알아보니, JPQL과 queryDsl 모두 '조회' 쿼리에 대해서는 영속성컨텍스트가 우선권을 가지는것으로 1차캐시 즉, clear()에 영향이 있는것으로 확인되었습니다.