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

taehee-kim-dev님의 프로필 이미지

작성한 질문수

실전! Querydsl

수정, 삭제 벌크 연산

영속성 컨텍스트 쿼리 질문 드립니다.

21.04.12 20:21 작성

·

251

0

안녕하세요, 강의 잘 듣고 있습니다.

질문을 드리고 싶어서요.

영속성 컨텍스트에 엔티티A가 있다고 가정해 볼게요.

EntityManager의 em.find()를 통해 엔티티A를 조회하면, EntityManager는 영속성 컨텍스트에 있는 엔티티A를 반환하고, 실제 DB에 select 쿼리는 날리지 않는걸로 알고 있어요.

그런데 queryFactory는 생성자 인자로 EntityManager를 받고 있음에도, 왜 해당 강의 7분 21초에서는 select 쿼리가 나가나요??

queryDSL은 EntityManager 차원의 find 실행이 아니고, JPQL 차원의 쿼리 실행이라, 무조건 쿼리가 나가는 건가요??

답변 1

2

김영한님의 프로필 이미지
김영한
지식공유자

2021. 04. 12. 21:52

안녕하세요. Taehee-kim-dev님^^

네 맞습니다. 추가로 스프링 데이터 JPA의 findByUsername도 JPQL이 실행되기 때문에 항상 쿼리가 실행됩니다.

감사합니다.

taehee-kim-dev님의 프로필 이미지

2021. 04. 12. 22:13

"스프링 데이터 JPA의 findByUsername도 JPQL이 실행되기 때문에 항상 쿼리가 실행됩니다."

이 답변에 질문이 있어요!!

그럼 영속성 컨텍스트에 "엔티티A"가 있으니, select 쿼리를 날리지 않고 영속성 컨텍스트의 엔티티A를 바로 반환하는 것은 오직 "Entity의 id값(db의 pk값)을 통해 조회할 때(예: em.find())"만 인가요??? 필드(컬럼)값을 기준으로 검색할 때는 무조건 JPQL이 실행되기 때문에 항상 쿼리가 실행되나요??

김영한님의 프로필 이미지
김영한
지식공유자

2021. 04. 12. 22:16

결론적으로 em.find()를 직접 호출하는 것을 제외한 모든 호출이 JPQL 쿼리가 실행됩니다. 스프링 데이터 JPA도 내부에서 em.find()를 호출하는 경우를 제외하면 JPQL이 실행됩니다.

감사합니다.