inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

실전! Querydsl

시작 - JPQL vs Querydsl

JPQL 실행직전 flush외에 clear도 함께 해주는것인지

720

kate

작성한 질문수 23

0

자바 ORM 표준 JPA프로그램 듣고 넘어왔습니다.

이전 기본강의에서는 JPQL이 flush를 먼저 수행이 된후 JPQL쿼리가 동작한다고 배웠는데요.

이게 EntityManager의 일반적인 find() 메소드의 경우

clear()을 한 뒤 준영속상태에서 비로서 select쿼리가 나가는것으로 알고있습니다. (그렇지 않으면 1차 캐시에서 조회)

근데 JPQL의 경우 flush는 자동으로 호출 되지만 clear 즉, 1차캐시와 연관성이 있느냐 없느냐에 대해서 궁금증이 생겼습니다.

clear를 직접 해주지 않았음에도 불구하고 쿼리가 나가는 이유에 대해서 clear를 자동으로 해줘서 쿼리가 나가게 된것인지? 혹은 1차 캐시와 상관없이 자연쿼리가 나가게 되는것인지 한번 더 다잡고 가고싶습니다.
답변 감사히 기다리겠습니다.

java jpa

답변 1

0

y2gcoder

안녕하세요. kate님, 공식 서포터즈 y2gcoder입니다.

먼저 entityManager의 find()의 작동과정은 다음과 같습니다.

  1. 1차 캐시에서 해당 식별자를 가진 엔티티를 찾는다.

  2. 1차 캐시에 해당 식별자를 가진 엔티티가 있다면 그 엔티티를 반환한다.

  3. 1차 캐시에 해당 식별자를 가진 엔티티가 없다면 DB 조회하여 엔티티를 찾는다.

  4. DB에서 조회해온 엔티티를 1차 캐시에 저장하고 해당 엔티티는 영속 상태가 된다.

flush()와 clear()는 아시는 것처럼 하는 역할이 다릅니다.

flush()는 영속성 컨텍스트의 변경 사항을 DB에 반영하게 됩니다. 이 과정에서 쓰기 지연 SQL 저장소에 있던 쓰기 쿼리들이 실제로 DB에 전송되는 것입니다.

clear()는 영속성 컨텍스트를 완전히 초기화해주는 메서드입니다. 영속성 컨텍스트를 초기화하고 나면 1차 캐시는 비워지고 모든 엔티티는 준영속 상태가 됩니다.

이를 JPQL과 비교해서 생각해보면 저희는 JPQL 직전 flush가 발생한다고 배웠습니다. flush가 발생한다는 말은 이전까지 있던 영속성 컨텍스트의 변경사항을 DB에 반영한다는 말로 이해할 수 있습니다. 그러므로 쿼리가 나가는 이유는 flush 때문으로 이해해주시면 될 것 같습니다.

 

감사합니다.

0

kate

제가 질문드린 요점은 jpql이 DB에 Query를 날릴때 EntityManager의 find()와 같이 clear() 메소드(1차캐시)와 연관이 있느냐 없느냐 였습니다.

조금 더 알아보니, JPQL과 queryDsl 모두 '조회' 쿼리에 대해서는 영속성컨텍스트가 우선권을 가지는것으로 1차캐시 즉, clear()에 영향이 있는것으로 확인되었습니다.

SpringBoot 4.X에서의 Querydsl 설정

0

95

2

querydsl 오픈소스에 대한 질문

1

76

1

예제에서의 카운트 쿼리에서 join문과 where문은 필요없지 않나요?

0

111

1

Querydsl 6.X버전에 대해서 어떻게 생각하시나요?

0

322

2

여러 테이블 조인하여 통계치를 구하고자 할 때 어떤 방법이 더 효율적일까요

1

71

1

fetchResults()는 더이상 권장되지 않는다는데 맞나요?

0

162

1

querydsl sum() 메서드 없어요.

0

160

2

build 디렉터리 생성

0

140

2

자바 ORM 표준 JPA 프로그래밍 - 기본편 듣고 바로 학습해도 괜찮을까요?

0

114

2

현재 Querydsl에서 from절 서브쿼리를 지원하나요?

0

93

1

오타 제보 드립니다.

0

73

2

벌크 연산과 flush, clear

0

76

1

Run As Intellij 로 변경시 Q타입 import 불가

0

89

1

QHello import하기 문제 발생

0

148

2

등록된 함수 보는법(H2Dialect) 질문

0

69

2

5.0부터 Querydsl은 향후 fetchCount() , fetchResult() 를 지원하지 않기로 결정했다고 하는데 이에 맞는 강의

1

199

2

[환경설정 PDF 부트 3.0이후 설명 질문] build.gradle에 compileQuerydsl을 정의하지 않은 상태에서 Gradle->Tasks->other->compileQuerydsl을 클릭하라고 하는 이유가 무엇인가요??

1

202

1

querydsl 설정 문제

0

222

2

quey dsl 설정부분

0

158

2

count 쿼리 관련 질문입니다!

0

75

1

stringtemplate를 이용하여 where절 검색 방법 질문 드립니다.

0

89

1

답변부탁드리겠습니다.

0

90

2

(OrderSpecifier)관련 내용 어디있을가요

0

66

1

중급문법 벌크연산에서

0

83

2