작성
·
370
·
수정됨
0
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.
1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)
질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)
[질문 내용]
여기에 질문 내용을 남겨주세요.
MemberTest 테스트클래스
testEntity() 코드입니다.
Team teamA = new Team("teamA");
Team teamB = new Team("teamB");
em.persist(teamA);
em.persist(teamB);
Member member1 = new Member("member1", 10, teamA);
Member member2 = new Member("member2", 20, teamA);
Member member3 = new Member("member3", 30, teamB);
Member member4 = new Member("member4", 40, teamB);
em.persist(member1);
em.persist(member2);
em.persist(member3);
em.persist(member4);
//초기화
em.flush();
em.clear();
List<Member> members = em.createQuery("select m from Member m ", Member.class)
.getResultList();
for (Member member : members) {
System.out.println("member = " + member);
System.out.println("-> member.team = " + member.getTeam());
}
처음에 즉시로딩 실행결과로
멤버 조회 쿼리 하나랑
각각 팀 조회 쿼리 +N번 (여기서는 2번) 나가는 것을 확인했습니다.
지연로딩으로도 쿼리실행시점 문제만 다르지 똑같이 member.getTeam() 할때 team쿼리가 나가는 것을 확인했습니다.
N+1문제를 해결하기 위해 페치조인을 한다는것은 강의와 학습을 통해 알게되었습니다.
질문이있는데요
처음에 즉시로딩할때 조인쿼리가 안나가고
왜 따로 member, team쿼리가 나간것일까요?
즉시로딩도 N+1문제가 발생하는것이 맞나요?
수정
단건조회 시 즉시로딩으로 left outer join 으로 member와 team이 함께 조회되는것을 확인했습니다.
단건조회가 아니라 memberRepository.findAll() 메소드나 JPQL (select m from Member m) 인경우에는 member와 team이 같은 한 쿼리가 아니라
따로 조회되는 것인가요? 왜 List를 조회할때에는 같이 join해서 쿼리를 날리지않는것일까요?
답변 2
0
0
안녕하세요, 인프런 AI 인턴이에요.
아래는 제가 하실 질문 내용에 대한 답변입니다.
다음과 같이 MemberTest 클래스의 testEntity() 코드가 있습니다.
Team teamA = new Team("teamA");
Team teamB = new Team("teamB");
em.persist(teamA);
em.persist(teamB);
Member member1 = new Member("member1", 10, teamA);
Member member2 = new Member("member2", 20, teamA);
Member member3 = new Member("member3", 30, teamB);
Member member4 = new Member("member4", 40, teamB);
em.persist(***기존 코드 누락됨***)
위 코드에서 em.persist() 메서드로 Member 객체를 영속화 하는 부분이 누락되어 있습니다.
수정된 코드는 아래와 같이 em.persist() 메서드로 Member 객체를 영속화 하시면 됩니다.
em.persist(member1);
em.persist(member2);
em.persist(member3);
em.persist(member4);
이렇게 수정하신 후 실행하시면 원하시는 결과를 얻으실 수 있을 거예요. 추가적인 질문이 있으시면 언제든지 물어보세요.
em.persist(member1)~em.persist(member4) 코드다있습니다!