728x90

fetch join 4

[JPA] Querydsl 에서 Fetch Join을 적용시키는 방법

문제 상황 Fetch join 은 한 번의 쿼리로 JOIN 대상 테이블 데이터까지 한 번에 가져오고 영속성 컨텍스트에 넣어주기 때문에 n+1 문제를 해결하기 위한 하나의 방법이다. 그래서 fetch join 을 적용하면 실제로 그렇게 되는지 확인해보고 싶었다. Querydsl QBook book = QBook.book; QPaper paper = QPaper.paper; List bookList = jpaQueryFactory .selectFrom(book) .join(book).on(book.id.eq(paper.id)).fetchJoin() .fetch(); 생성된 SQL SELECT book.id FROM book INNER JOIN paper ON (book.id=paper.id) SELECT p..

QueryDSL 2022.10.15

QueryDsl 조인 종류

조인(Join)은 innerJoin(join), leftJoin, rightJoin, fullJoin을 사용할 수 있다. 추가로 JPQL의 on과 성능 최적화를 위한 fetch 조인도 사용할 수 있다. 조인의 기본 문법은 첫 번째 파라미터에 조인 대상을 지정하고, 두 번째 파라미터에 별칭으로 사용할 쿼리타입을 지정한다. join(조인대상, 별칭으로 사용할 쿼리 타입) QOrder order = QOrder.order; QMember member = Qmember.member; QOrderItem orderItem = QOrderItem.orderItem; query.from(order) .join(order.member, member) .leftJoin(order.orderItems, orderItem)..

QueryDSL 2022.06.17

페치 조인과 일반 조인의 차이(feat. 연관된 엔티티 함께 조회)

페치 조인을 사용하지 않고 조인만 사용하면 어떻게 될까 select t-- 내부 조인 JPQL from Team t join t.members m where t.name = '팀A' SELECT--실행된 SQL T.* FROM TEAM T INNER JOIN MEMBER M ON T.ID=M.TEAM_ID WHERE T.NAME = '팀A' JPQL에서 팀과 회원 컬렉션을 조인했으므로 회원 컬렉션도 함께 조회할 것으로 기대해선 안 된다. 실행된 SQL의 SELECT 절을 보면 팀만 조회하고 조인했던 회원은 전혀 조회하지 않는다. JPQL은 결과를 반환할 때 연관관계까지 고려하지 않는다. 단지 SELECT 절에 지정한 엔티티만 조회할 뿐이다. 따라서 팀 엔티티만 조회하고 연관된 회원 컬렉션은 조회하지 않는..

JPA 2022.06.15

페치 조인(fetch join) 의 활용

(JPA) 페치 조인(fetch join) 의 활용 JPQL에서 성능 최적화를 위해 제공하는기능입니다. 연관된 엔티티나 컬렉션을 SQL 한 번에 함께 조회하는 기능입니다. join fetch 명령어를 사용합니다. 페치 조인 예(v1(안쓴 버전), v2(쓴 버전) 비교) /** * V1. 엔티티를 조회해서 DTO로 변환(fetch join 사용X) * - 단점: 지연로딩으로 쿼리 N번 호출 */ @GetMapping("/api/v1/simple-orders") public List ordersV1() { List orders = orderRepository.findAll(); List result = orders.stream() .map(o -> new SimpleOrderDto(o)) .collect(t..

JPA 2022.02.14
728x90