상황 : QueryDsl을 통해 fetch join을 한 이후 Dto로 바로 반환하려고 했는데 에러가 발생했다.

 

원인

  • fetch join을 사용하면 엔티티 그래프 기능을 사용하게 된다.
  • 엔티티 그래프는 엔티티들 끼리 서로 연관되어 있는 관계를 그래프로 표현한 것으로, jpa가 어떤 엔티티를 불러올 때 이 엔티티와 관계된 엔티티를 불러올 것인지에 대한 정보를 제공한다.
  • 엔티티 그래프는 엔티티만을 반환하기 때문에 Dto로 반환할 수 없다. 

해결책 : 일반 join만을 사용하면 Dto로 반환할 수 있다. 이 때 JPQL 쿼리 자체가 필요한 데이터를 명시적으로 선택하여 가져오기 때문에, 연관된 엔티티를 추가적으로 조회하는 Lazy Loading이 동작하지 않는다. 따라서 N+1 문제가 발생하지 않는다.

 

@Override
public List<CommentResponseDto> findAllByPostId(Long postId) {
    QCommentEntity parent = new QCommentEntity("parent");
    return jpaQueryFactory
            .select(new QCommentResponseDto(
                    commentEntity.id,
                    commentEntity.content,
                    commentEntity.reportCount,
                    parent.id,
                    user.nickname
            ))
            .from(commentEntity)
            .join(commentEntity.user, user)//.fetchJoin()하면 오류 발생 
            .leftJoin(commentEntity.parent, parent)//.fetchJoin()하면 오류 발생
            .orderBy(commentEntity.id.asc())
            .fetch();

}

'Spring Boot > JPA' 카테고리의 다른 글

임베디드 타입 in JPA  (0) 2024.10.22
entity 기본 생성자 in jpa  (0) 2024.10.11
사용자 정의 리포지토리  (0) 2024.08.29
벌크 연산 주의 사항  (0) 2024.08.24
@OneToOne Lazy loading 한계  (0) 2024.08.16

+ Recent posts