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 |
29 | 30 |
Tags
- api 성능최적화
- 낙관적 락
- 좋아요 기능
- spring 예외처리
- 쉘스크립트
- thymeleaf
- 예외처리
- 사설IP
- 스프링 공통데이터
- JPA #N+1 #JPA API #API
- 타임리프
- validation
- jpa 성능최적화
- 타임리프 예외처리
- smtp
- 스프링 예외처리
- JPA
- 지연로딩
- thymleaf
- HTTP API
- LazyInitializationException
- jpa hint
- DATA JPA
- querydsl
- 쿠키 #세션 #쿠키세션정리
- springboot
- 비관적 락
- 스프링부트
- 공인IP
- password
Archives
- Today
- Total
jiny
[DATA JPA] @EntityGraph 지연로딩 해결 - 연관된 엔티티들을 같이 조회하기 본문
EntityGraph 는 JPQL을 사용하지 않고 페치 조인을 사용하는 기능이다
우선 Member 와 Team 이 다대일 관계이고, Member 에서 Team이 지연로딩 관계로 설정된 상황일 때
findAll() 메소드 호출 시, 멤버들을 모두 조회하기 위한 쿼리가 한번 나가고
for 문에서 각 멤버마다 속한 팀의 이름을 호출할 때 마다 team을 찾기 위한 쿼리가 추가로 나간다
1+N 문제가 발생하며, 연관된 엔티티를 한번에 조회하려면 아래처럼 페치조인이 필요하다
@EntityGraph 사용하기
JPQL을 사용하지 않고 아래처럼 엔티티 그래프 기능을 사용하여 페치 조인을 사용할 수 있다.
- attributePaths 에 스트링 배열 형태로 연관된 엔티티 변수명을 적어준다
data-jpa에서 기본으로 제공하는 findAll() 메소드를 오버라이드해서 사용도 가능하다
JPQL과 같이 사용해도 상관은 없다
다시 findAll 을 사용하여 쿼리를 확인하면
LEFT OUTER JOIN 을 사용하여 멤버를 기본적으로 모두 조회하면서
연관된 Team가 존재하면 같이 불러오고 있다.
NamedEntityGraph
NamedQuery 처럼 도메인 엔티티에 함께 불러올 엔티티를 이름과 함께 지정하여
리포지토리에서 선택하여 불러올 수 있다.
findMemberEntityGraph() 를 호출하면 Member.all 값을 이용하여
Member 엔티티에서 동일한 Member.all 값을 찾아 페치조인을 실행한다.
[출처]
'서버 > JPA' 카테고리의 다른 글
[JPA] 좋아요 기능 동시성 테스트 및 락기능 활용하기 (0) | 2023.03.09 |
---|---|
[JPA] LazyInitializationException (0) | 2023.03.08 |
[DATA JPA] JPA Hint 사용하여 select 쿼리 최적화하기 (0) | 2023.02.28 |
[DATA JPA] 주요 기능 정리 (0) | 2023.02.28 |
[JPA] API 요청 및 응답 시 주의 사항 1 (0) | 2023.01.11 |