Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- QueryDSL
- 그리디
- 자바
- db
- java
- pointcut
- Spring Boot
- 알고리즘
- AOP
- JDBC
- kotlin
- spring
- http
- Exception
- Thymeleaf
- transaction
- 스프링 핵심 기능
- jpa
- Servlet
- Proxy
- 스프링 핵심 원리
- Greedy
- 스프링
- 인프런
- JPQL
- 김영한
- springdatajpa
- Android
- SpringBoot
- 백준
Archives
- Today
- Total
개발자되기 프로젝트
지연 로딩과 조회 성능 최적화(FETCH JOIN) 본문
FETCH JOIN
실무에서 저어어어어어어어ㅓ엉어어어엉말 중요함. 1. fetch join SQL 조인의 종류가 아님 JPQL에서 성능 최적화를 위해 제공하는 기능 연관된 엔티티나 컬렉션을 SQL 한 번에 함께 조회하는 기능임. j
bsh-developer.tistory.com
Fetch Join2
1. 페치 조인의 특징과 한계 페시 조인 대상에는 별칭을 줄 수 없다. 하이버네이트는 가능, 하지만 가급적 사용하지 말자. fetch join은 나랑 연관된 엔티티를 전부 다 가져옴. 따라서 fetch join에 별
bsh-developer.tistory.com
1. Fetch Join을 활용
public List<Order> findAllWithMemberDelivery() {
return em.createQuery("select o from Order o " +
"join fetch o.member " +
"join fetch o.delivery", Order.class).getResultList();
}
- join fetch 를 통해 order를 가져오는 쿼리 한 번에 member와 delibery도 함께 조회한다.
@GetMapping("/api/v3/simple-orders")
public List<SimPleOrderDto> ordersV3(){
List<Order> orders = orderRepository.findAllWithMemberDelivery();
List<SimPleOrderDto> result = orders.stream()
.map(o -> new SimPleOrderDto(o))
.collect(Collectors.toList());
return result;
}
- 와! 쿼리 한번으로 끝났다.
Hibernate:
select
order0_.order_id as order_id1_6_0_,
member1_.member_id as member_i1_4_1_,
delivery2_.delivery_id as delivery1_2_2_,
order0_.delivery_id as delivery4_6_0_,
order0_.member_id as member_i5_6_0_,
order0_.order_date as order_da2_6_0_,
order0_.status as status3_6_0_,
member1_.city as city2_4_1_,
member1_.street as street3_4_1_,
member1_.zipcode as zipcode4_4_1_,
member1_.name as name5_4_1_,
delivery2_.city as city2_2_2_,
delivery2_.street as street3_2_2_,
delivery2_.zipcode as zipcode4_2_2_,
delivery2_.status as status5_2_2_
from
orders order0_
inner join
member member1_
on order0_.member_id=member1_.member_id
inner join
delivery delivery2_
on order0_.delivery_id=delivery2_.delivery_id
2. 정리
- 엔티티를 fetch join을 사용하여 쿼리 한 번으로 모두 조회함
- 페치 조인으로 인해 order -> member, order -> delivery 는 이미 조회된 상태로 지연로딩 적용될 필요 없음.
3. GitHiub : 210822 FETCH JOIN
GitHub - bsh6463/SpringBootJPA1
Contribute to bsh6463/SpringBootJPA1 development by creating an account on GitHub.
github.com
'인프런 > [인프런] Springboot와 JPA활용 2' 카테고리의 다른 글
컬렉션 조회 최적화 (0) | 2021.08.24 |
---|---|
지연 로딩과 조회 성능 최적화(JPA에서 DTO 바로 조회) (0) | 2021.08.23 |
지연로딩과 성능최적화(DTO, N+1) (0) | 2021.08.22 |
지연로딩과 조회성능 최적화(엔티티 노출) (0) | 2021.08.22 |
API 개발 고급 소개 1 (0) | 2021.08.22 |
Comments