상세 컨텐츠

본문 제목

[데이터베이스]JPQL : N + 1 문제, Fetch Join, 주의사항

😎 지식/BE-Spring🌐

by :Eundms 2023. 7. 11. 09:02

본문

발생 상황

String jpql = "select m from Member m";
List<Member> members = em.createQuery(jpql, Member.class) 
												 .getResultList();
for (Member member : members) {
    System.out.println("username = " + member.getUsername() + ", " +
					             "teamName = " + member.getTeam().name());
	//회원1, 팀A(SQL)
	//회원2, 팀A(1차 캐시)
	//회원3, 팀B(SQL)

	//회원 100명 -> N + 1
}

 
 
최대 N + 1번 Team 조회 쿼리 수행

해결 방안

- fetch join 

String jpql = "select m from Member m join fetch m.team";
List<Member> members = em.createQuery(jpql, Member.class) 
												 .getResultList();
for (Member member : members) {
    //페치 조인으로 회원과 팀을 함께 조회해서 지연 로딩X
    System.out.println("username = " + member.getUsername() + ", " +
					             "teamName = " + member.getTeam().name());
}

 

Fetch Join 주의사항

일대다를 다대일로 방향을 전환하여 해결한다
- BatchSize()

public class Team{
...
@BatchSize(size = 100)  
@OneToMany(mappedBy = "team")
private List<Member> members;
...
}
String query = "select t from Team t";
  • 모든 것을 Fetch Join으로 해결할 수는 없음
  • Fetch Join은 객체 그래프를 유지할 때 사용하면 효과적
  • 여러 테이블을 조인해서 엔티티가 아닌 전혀 다른 결과를 내야 하면, Fetch Join 보다는 일반 조인을 사용하고 필요한 데이터들만 조회해서 DTO로 반환하는 것이 효과적

 


- 출처
김영한님 인프런 강의 중 한 곳

댓글 영역