[ 게시글 상세 보기 ]
[ default_batch_fetch_size 사용 X ] → 쌤이 쓰는 쿼리
설정에서 디폴트 배치 사이즈 삭제하고 시작!
[ 쿼리문 ]
BoardId가 ? 인 것의 Reply랑 User를 조회하는 쿼리 Reply 엔터티 내의 board 필드(@ManyToOne 관계일 것)를 통해 Board 엔터티와 간접적으로 조건을 맺어 조인한다. Board의 id 값을 조건으로 사용하여, 특정 Board 엔터티에 연관된 Reply 엔터티들을 조회함 -> Reply 엔터티를 기준으로 User 엔터티는 직접 조인하고, Board 엔터티는 조건을 통해 간접적으로 조인
[ BoardService ]
보드도 넘기고 REPLY도 넘김 -> 조회 2번
Board 엔티티가 들고있는 getReply를 안 쓰고 한 번 더 조회해서 넣는 것 내가 조회한 reply니까 레이지 로딩이 없다. (= 이 reply는 이미 user를 조인했으니 레이지 로딩 없음) 쿼리는 Board-User 조인, Reply-User 조인 된 쿼리가 나온다 이렇게 끝!
DTO를 만드는 과정에서 필요한 모든 데이터를 미리 불러와서 담아두기 때문에,
DTO를 사용자에게 보낸 후에는 레이지 로딩이 일어날 일이 없다!
[ 쿼리문 확인 ]
자료 필요
[ 한방 쿼리 버전 ]
@Query("select b from Board b join fetch b.user left join fetch b.replies r join fetch r.user ru where b.id = :id") Board findDetail(@Param("id") int id);
[ 쿼리 테스트 결과 ]
Share article