인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

jaesungyoun님의 프로필 이미지

작성한 질문수

실전! Querydsl

Querydsl Fetchjoin 해서 이미 조회한 엔티티를 Spring Data JPA findBy 다시 하면 영속성 컨텍스트에서 가져오지 않고 쿼리가 실행되는 문제

작성

·

58

·

수정됨

0

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? 예
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예
3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예

[질문 내용]

강사님 안녕하세요.

프로젝트를 진행하다가 Querydsl의 fetcjoin을 쓰고, 로직 처리를 위해 엔티티를 따로 조회하기 위해 다음과 같이 코드를 짰는데,

 

image.png

 

중간에 for 문으로 c.getUser()했을 떄는 fetcjoin이 제대로 되어서 쿼리가 발생하지 않고, userId가 1인 UserEntity가 잘 조회됩니다.

그런데 이미 userId가 1인 user 엔티티가 조회 됐음에도 불구하고 맨 아래의 userId가 1인 User findBy를 사용하여 조회하면 select UserEntity where userId=1 인 한 번 더 쿼리가 발생합니다.

원래 fetcjoin는 엔티티.get연관엔티티() 에서만 작동을 하는 걸까요?

for 문 돌면서 id 체크하고 c.getUser()로 재사용하기에는 비효율적일 것 같은데 지금과 같은 상황에서는 어떤 식으로 쿼리가 한 번더 발생하지 않으면서 동일한 이미 fetcjoin으로 가져온 엔티티를 사용할 수 있는 좋은 방법이 있는지 궁금합니다.

image.png

fetcjoin 한 getPopUpStoreComments querydsl 코드는 위와 같습니다.

 

감사합니다.

답변 1

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다.

jaesungyoun님께서 경험하고 있는 문제는 Querydsl의 fetchJoin과 관련된 일반적인 쿼리 성능 최적화 이슈입니다. fetchJoin을 사용하였음에도 불구하고 추가적인 쿼리가 발생하는 이유와 이를 해결하는 방법을 살펴보겠습니다.

  1. FetchJoin과 연관 엔티티 로딩:

    • fetchJoin을 사용하면 주 엔티티와 연관된 엔티티를 한 번의 쿼리로 불러와 영속성 컨텍스트에 저장합니다. c.getUser()를 호출할 때 추가적인 쿼리를 발생시키지 않는 것은 fetchJoin의 효과가 잘 나타나는 부분입니다.
  2. 독립적인 엔티티 조회:

    • 하지만 fetchJoin으로 이미 선택된 엔티티와 별도로 특정 엔티티를 다시 조회하려는 경우(예: userRepository를 사용한 findById), 새로운 프록시 혹은 데이터베이스 조회가 발생할 수 있습니다. 이는 영속성 컨텍스트가 이미 로드한 엔티티를 인식하지 못하는 경우 혹은 다른 컨텍스트에서 실행된 경우에 발생합니다.
  3. Query 최적화 방법:

    • 영속성 컨텍스트 활용: 이미 조회된 엔티티를 다시 사용할 때에는 같은 트랜잭션 내에 있어야 하며, 이미 로드된 데이터는 1차 캐시를 통해 관리됩니다. 따라서 같은 트랜잭션 내에서 같은 EntityManagerSession을 활용해야 합니다.
    • 엔티티 상태 유지: fetchJoin으로 가져온 엔티티를 다른 메소드를 통해 불러오고자 할 때, 엔티티 매니저가 동일한 상태를 유지할 수 있도록 @Transactional 어노테이션을 적절히 활용합니다.

아래는 참고할 만한 질문 링크입니다:
- fetch join시 에러 문제 문의입니다!
- fetch join 관련 질문 드립니다!!

유사한 경험을 공유한 다른 분들의 질문을 참조하여 현재의 상황을 보다 깊이 있게 이해하고 해결 방법을 찾아보세요.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.