- Comment 조회 - 1번
- Comment의 갯수(각 Comment가 가지고 있는 Board 조회) - N번
이렇게 하면 N+1번의 쿼리가 발생하는 것
@ManyToOne
속성에 fetch 속성으로 LAZY
를 주면 된다public class Comment {
...
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "thread_id")
Board thread;
}
EAGER
와 똑같지만, EAGER
의 경우에는 N+1 쿼리가 발생하지만 Fetch Join
의 경우에는 한번이 쿼리문으로 해결이 가능@Query
어노테이션을 이용하여 JPQL를 생성할 수 있다join fetch
뒤에 연관된 엔티티나 컬렉션을 적어주면 된다public interface CommentRepository extends JpaRepository<Comment, Long> {
@Query("select c from Comment c join fetch c.board")
List<Comment> findAll();
}
@EntityGraph
도 마찬가지로 EntityGraph 상에 있는 Entity들의 연관관계 속에서 필요한 엔티티와 컬렉션을 함께 조회하려고 할때 사용@EntityGraph
어노테이션을 달고 옵션을 준다attributePaths
는 같이 조회할 연관 엔티티명을 적으면 된다.type
은 EntityGraphType.LOAD
, EntityGraphType.FETCH
2가지LOAD
FETCH
public interface CommentRepository extends JpaRepository<Comment, Long> {
@EntityGraph(attributePaths = {"thread"}, type = EntityGraph.EntityGraphType.LOAD)
List<Comment> findAll();
}