해결된 질문
작성
·
59
0
즉시로딩 관계에서 조회를 할때 어떤 경우는 연관관계에 있는 데이터들을 join으로 한번에 끌고오는 경우가 있고 어떤때는 N + 1 문제가 발생하는 경우가 있었습니다. 그래서 아래와 같이 테스트를 해봤는데요 우선 member와 team의 관계를 즉시로딩으로 설정했습니다. 그리고 member을 한번만 저장하든 여러번 저장하든 N+ 1 문제가 발생했습니다. 그래서 즉시로딩 관계에서 어떤 경우에 연관관계에 있는 데이터들을 한번에 조인해서 가져오는지 궁금합니다.
Team team = new Team();
team.setName("team1");
em.persist(team);
Team team2 = new Team();
team2.setName("team1");
em.persist(team2);
Member member = new Member();
member.setName("hi1");
member.setTeam(team);
em.persist(member);
Member member2 = new Member();
member2.setName("hi2");
member2.setTeam(team2);
em.persist(member2);
Member member3 = new Member();
member3.setName("hi3");
member3.setTeam(team2);
em.persist(member3);
em.flush();
em.clear();
List<Member> members = em.createQuery("select m from Member m", Member.class)
.getResultList();
tx.commit();
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
감바스님의 질문은 즉시 로딩(EAGER
로딩) 관계에서 JPA가 어떻게 연관된 엔티티들을 가져오는지, 특히 어떤 경우에 N+1
문제가 발생하는지에 대한 궁금증을 담고 있네요.
즉시 로딩 방식에서 JPA가 SQL 조인을 사용하여 관련된 엔티티 데이터들을 한 번에 가져오는 로직의 동작 방식과 N+1
문제에 대해서 설명 드리겠습니다.
즉시 로딩(EAGER
)과 N+1
문제: EAGER
로딩 방식을 사용할 때, 연관된 엔티티를 같이 로드하려고 합니다. 하지만, 이 때 JPQL이나 Criteria API 등을 사용해 조회할 경우 N+1
문제가 발생할 수 있습니다. 예를 들어, 한 번의 쿼리로 Member를 조회하고나서 연관된 Team 엔티티를 로딩하기 위해 추가적으로 각 Member마다 별도의 SQL 쿼리를 실행하는 경우입니다.
조인 쿼리와 N+1
문제 회피: 일반적으로 JPQL에서 명시적으로 JOIN FETCH
를 사용하거나, Criteria API에서 fetch
조인을 사용하여 특정 엔티티와 그 연관 엔티티를 한 번의 쿼리로 불러오도록 할 수 있습니다. 이 방법은 N+1
문제를 효과적으로 해결합니다.
즉시 로딩에서 N+1
문제가 발생하는 구체적인 사례와 해결 방법에 대한 자세한 설명은 아래 링크들에서 확인하실 수 있습니다.
지연로딩 에서의 N+1 문제 - 여기서 설명하는 내용은 지연 로딩과 관련되어 있지만, 즉시 로딩에서 발생할 수 있는 N+1
문제에 대해서도 유용한 인사이트를 제공합니다.
N+1의 문제와 LAZY, EAGER - 질문이 지연 로딩과 즉시 로딩에서 N+1
문제의 발생 조건과 우회 방법에 대해 설명합니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.